require(phyloseq)
require(tidyverse)
require(phyloseq)
require(reshape2)
require(dplyr)
require(ggplot2)
require(microbiome)
Loading required package: microbiome

microbiome R package (microbiome.github.com)
    


 Copyright (C) 2011-2020 Leo Lahti, 
    Sudarshan Shetty et al. <microbiome.github.io>


Attaching package: ‘microbiome’

The following object is masked from ‘package:micrUBIfuns’:

    prevalence

The following object is masked from ‘package:psych’:

    alpha

The following object is masked from ‘package:vegan’:

    diversity

The following object is masked from ‘package:ggplot2’:

    alpha

The following object is masked from ‘package:base’:

    transform
require(vegan)

Load data

ps_dmn <- readRDS("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/data/PhyloseqObjects/ITS/DMN_ests_ITS.Rdata")
sample_data(ps_dmn)$Herbicide <- factor(sample_data(ps_dmn)$Herbicide, levels = c("Aatrex", "Clarity", "Hand","Non-Treated","Roundup Powermax"))
sample_data(ps_dmn)$herb_time<-paste(sample_data(ps_dmn)$Herbicide, sample_data(ps_dmn)$Time, sep = "_")

#regroup all chemical treatments together and rerun betadiv calcs within group. 
sample_data(ps_dmn)$Mode<-sample_data(ps_dmn)$Herbicide

index <- c("Clarity", "Roundup Powermax", "Aatrex", "Hand", "Non-Treated")
values <- c("Chemical", "Chemical", "Chemical", "Hand", "Non-Treated")

sample_data(ps_dmn)$Mode<- as.factor(values[match(sample_data(ps_dmn)$Mode, index)])

index <- c("Clarity", "Roundup Powermax", "Aatrex", "Hand", "Non-Treated")
values <- c("Dicamba", "Glyphosate", "Atrazine-Mesotrione", "Handweeded", "Non-Treated")

sample_data(ps_dmn)$Herbicide <- as.factor(values[match(sample_data(ps_dmn)$Herbicide, index)])


ps_rare <- readRDS("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/data/PhyloseqObjects/ITS/HerbPt1_rare_ITS.Rdata")
sample_data(ps_rare)$Herbicide <- factor(sample_data(ps_rare)$Herbicide, levels = c("Aatrex", "Clarity", "Hand","Non-Treated","Roundup Powermax"))
sample_data(ps_rare)$herb_time<-paste(sample_data(ps_rare)$Herbicide, sample_data(ps_rare)$Time, sep = "_")


#regroup all chemical treatments together and rerun betadiv calcs within group. 
sample_data(ps_rare)$Mode<-sample_data(ps_rare)$Herbicide

index <- c("Clarity", "Roundup Powermax", "Aatrex", "Hand", "Non-Treated")
values <- c("Chemical", "Chemical", "Chemical", "Hand", "Non-Treated")

sample_data(ps_rare)$Mode<- as.factor(values[match(sample_data(ps_rare)$Mode, index)])

index <- c("Clarity", "Roundup Powermax", "Aatrex", "Hand", "Non-Treated")
values <- c("Dicamba", "Glyphosate", "Atrazine-Mesotrione", "Handweeded", "Non-Treated")

sample_data(ps_rare)$Herbicide <- as.factor(values[match(sample_data(ps_rare)$Herbicide, index)])


ps_trans <- readRDS("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/data/PhyloseqObjects/ITS/HerbPt1_hel_trans_ITS.Rdata")
sample_data(ps_trans)$Herbicide <- factor(sample_data(ps_trans)$Herbicide, levels = c("Aatrex", "Clarity", "Hand","Non-Treated","Roundup Powermax"))
sample_data(ps_trans)$herb_time<-paste(sample_data(ps_trans)$Herbicide, sample_data(ps_trans)$Time, sep = "_")


#regroup all chemical treatments together and rerun betadiv calcs within group. 
sample_data(ps_trans)$Mode<-sample_data(ps_trans)$Herbicide

index <- c("Clarity", "Roundup Powermax", "Aatrex", "Hand", "Non-Treated")
values <- c("Chemical", "Chemical", "Chemical", "Hand", "Non-Treated")

sample_data(ps_trans)$Mode<- as.factor(values[match(sample_data(ps_trans)$Mode, index)])

index <- c("Clarity", "Roundup Powermax", "Aatrex", "Hand", "Non-Treated")
values <- c("Dicamba", "Glyphosate", "Atrazine-Mesotrione", "Handweeded", "Non-Treated")

sample_data(ps_trans)$Herbicide <- as.factor(values[match(sample_data(ps_trans)$Herbicide, index)])

Remove samples that are outlines or under sequenced.

ps_dmn <-  subset_samples(ps_dmn, sample_names(ps_dmn) != "G009SG")
ps_dmn <-  subset_samples(ps_dmn, sample_names(ps_dmn) != "G095SG")
ps_dmn <-  subset_samples(ps_dmn, sample_names(ps_dmn) != "G123SG")
ps_dmn <-  subset_samples(ps_dmn, sample_names(ps_dmn) != "G129SG")

ps_rare <-  subset_samples(ps_rare, sample_names(ps_rare) != "G009SG")
ps_rare <-  subset_samples(ps_rare, sample_names(ps_rare) != "G095SG")
ps_rare <-  subset_samples(ps_rare, sample_names(ps_rare) != "G123SG")
ps_rare <-  subset_samples(ps_rare, sample_names(ps_rare) != "G129SG")
ps_rare_sub<-prune_taxa(taxa_sums(ps_rare) > 2, ps_rare)

ordinations and adonis testing with three separate objects (i.e., dmn, rarefied, transformed). Rare taxa are removed from rarefied and transformed to successfully ordinate. At this point, the transformed data will not ordinate. This section is full dataset ordinations.


ord_dmn<-ordinate(physeq = ps_dmn, method = "NMDS", distance = "bray", k=3, trymax= 300, maxit = 1000)

ord_rare<-ordinate(physeq = ps_rare_sub, method = "NMDS", distance = "bray", k=3, trymax= 300, maxit = 1000)

ps_trans_sub<-prune_taxa(taxa_sums(ps_trans) > 0.01, ps_trans)
ord_transformed<-ordinate(physeq = ps_trans_sub, method = "NMDS", distance = "bray", k=3, trymax= 300, maxit = 1000)

create alphadiversity tables

sample_sums(ps_rare)
G001SG G002SG G003SG G004SG G005SG G006SG G007SG G008SG G010SG G012SG G013SG G014SG G016SG G017SG G018SG G019SG G020SG 
  1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000 
G021SG G022SG G024SG G025SG G026SG G027SG G028SG G029SG G030SG G031SG G032SG G033SG G034SG G035SG G036SG G037SG G038SG 
  1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000 
G039SG G040SG G041SG G043SG G044SG G045SG G046SG G047SG G048SG G050SG G051SG G052SG G053SG G054SG G056SG G057SG G058SG 
  1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000 
G059SG G060SG G062SG G063SG G064SG G065SG G066SG G067SG G068SG G069SG G070SG G071SG G072SG G073SG G074SG G075SG G076SG 
  1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000 
G077SG G078SG G079SG G080SG G081SG G082SG G083SG G084SG G085SG G086SG G087SG G088SG G090SG G091SG G093SG G094SG G096SG 
  1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000 
G097SG G098SG G100SG G101SG G102SG G103SG G104SG G105SG G106SG G107SG G108SG G109SG G111SG G112SG G113SG G114SG G115SG 
  1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000 
G117SG G118SG G121SG G122SG G124SG G125SG G126SG G127SG G128SG G130SG G131SG G132SG G133SG G134SG G135SG G136SG G137SG 
  1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000 
G139SG G140SG G141SG G142SG G143SG G144SG G145SG G146SG G147SG G148SG G149SG G150SG G151SG G153SG G154SG G155SG G156SG 
  1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000 
G157SG G158SG G159SG G160SG G161SG G162SG G163SG G164SG G166SG G167SG G168SG G169SG G170SG G171SG G172SG G173SG G174SG 
  1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000   1000 
G176SG G178SG G179SG G180SG 
  1000   1000   1000   1000 
ps_rare
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 2033 taxa and 157 samples ]
sample_data() Sample Data:       [ 157 samples by 53 sample variables ]
tax_table()   Taxonomy Table:    [ 2033 taxa by 7 taxonomic ranks ]
alpha_div <- estimate_richness(physeq = ps_rare, measures = c("Observed", "Shannon", "Chao1"))
#pull out metadata and concatonate with alpha diversity metrics
md<-data.frame(sample_data(ps_rare))
alpha_div_md <- rownames_to_column(alpha_div, "Barcode_ID_G") %>% full_join(md) 
Joining, by = "Barcode_ID_G"
alpha_div_md$Herbicide <- factor(alpha_div_md$Herbicide, levels = c("Non-Treated", "Handweeded", "Atrazine-Mesotrione", "Dicamba", "Glyphosate"))

Shannon Div plots - no significant differences among herbicide treatments at any of the three time points

ggplot(data = alpha_div_md, aes(Herbicide, Shannon, color= Herbicide)) + facet_grid(. ~ Time) + geom_boxplot() + theme_classic() + theme(axis.text.x = element_text(angle = 45, hjust = 1) )

ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_Shannon.pdf")
Saving 7.29 x 4.51 in image

aov_t1<-aov(Shannon ~ Herbicide, data = alpha_div_md[alpha_div_md$Time == "T1",])
plot(aov_t1$residuals)

summary(aov_t1)
            Df Sum Sq Mean Sq F value Pr(>F)
Herbicide    4  0.389 0.09720    1.26  0.299
Residuals   48  3.704 0.07716               
aov_t2<-aov(Shannon~ Herbicide, data = alpha_div_md[alpha_div_md$Time == "T2",])
plot(aov_t2$residuals)

summary(aov_t2)
            Df Sum Sq Mean Sq F value Pr(>F)
Herbicide    4 0.1234 0.03086   0.508   0.73
Residuals   46 2.7936 0.06073               
aov_t3<-aov(Shannon ~ Herbicide, data = alpha_div_md[alpha_div_md$Time == "T3",])
plot(aov_t3$residuals)

summary(aov_t3)
            Df Sum Sq Mean Sq F value Pr(>F)  
Herbicide    4 0.5376 0.13440   2.551  0.051 .
Residuals   48 2.5287 0.05268                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
TukeyHSD(aov_t3, "Herbicide")
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = Shannon ~ Herbicide, data = alpha_div_md[alpha_div_md$Time == "T3", ])

$Herbicide
                                        diff         lwr       upr     p adj
Handweeded-Non-Treated           0.086844630 -0.19738244 0.3710717 0.9078666
Atrazine-Mesotrione-Non-Treated  0.129708505 -0.14882205 0.4082391 0.6803851
Dicamba-Non-Treated             -0.002861275 -0.30174872 0.2960262 0.9999999
Glyphosate-Non-Treated           0.273363070 -0.01086400 0.5575901 0.0647237
Atrazine-Mesotrione-Handweeded   0.042863876 -0.22867317 0.3144009 0.9914461
Dicamba-Handweeded              -0.089705904 -0.38208716 0.2026754 0.9066040
Glyphosate-Handweeded            0.186518440 -0.09085878 0.4638957 0.3282566
Dicamba-Atrazine-Mesotrione     -0.132569780 -0.41941651 0.1542769 0.6864852
Glyphosate-Atrazine-Mesotrione   0.143654565 -0.12788248 0.4151916 0.5679081
Glyphosate-Dicamba               0.276224345 -0.01615691 0.5686056 0.0724032

Adonis testing of herbicide treatments by time point

ps_adonis<-function(physeq){
  otu_tab<-data.frame(phyloseq::otu_table(physeq))
  md_tab<-data.frame(phyloseq::sample_data(physeq))
    if(taxa_are_rows(physeq)== T){
       physeq_dist<-parallelDist::parDist(as.matrix(t(otu_tab)), method = "bray")}
            else{physeq_dist<-parallelDist::parDist(as.matrix(otu_tab), method = "bray")}
  print(anova(vegan::betadisper(physeq_dist, md_tab$Herbicide)))
  vegan::adonis(physeq_dist ~ Herbicide * Time + Total_Weed_Veg , data = md_tab, permutations = 1000)
}
#ps_adonis(ps_rare_sub)
#remove one sample with no vegetation measurement. 
ps_rare_sub_57<-subset_samples(ps_rare_sub, sample_names(ps_rare_sub) != "G065SG")
ps_adonis(ps_rare_sub_57)
#ps_adonis(ps_trans_sub)
ps_dmn_57<-subset_samples(ps_dmn, sample_names(ps_dmn) != "G065SG")
#ps_adonis(ps_dmn)
ps_adonis(ps_dmn_57)

Ordination plots DMN by time point

ord_t1_dmn<-ordinate(physeq = subset_samples(ps_dmn, Time=="T1"), method = "NMDS", distance = "bray", k=3, trymax= 100)
Run 0 stress 0.1335559 
Run 1 stress 0.1309245 
... New best solution
... Procrustes: rmse 0.06976384  max resid 0.2060325 
Run 2 stress 0.1315098 
Run 3 stress 0.132755 
Run 4 stress 0.134753 
Run 5 stress 0.1308758 
... New best solution
... Procrustes: rmse 0.0538814  max resid 0.2344595 
Run 6 stress 0.1331698 
Run 7 stress 0.1323904 
Run 8 stress 0.1346675 
Run 9 stress 0.1350022 
Run 10 stress 0.1322358 
Run 11 stress 0.1334733 
Run 12 stress 0.1315248 
Run 13 stress 0.1331407 
Run 14 stress 0.1327605 
Run 15 stress 0.1332143 
Run 16 stress 0.1369199 
Run 17 stress 0.1339829 
Run 18 stress 0.1331858 
Run 19 stress 0.1360529 
Run 20 stress 0.1352334 
Run 21 stress 0.1308759 
... Procrustes: rmse 0.001713885  max resid 0.006848176 
... Similar to previous best
*** Solution reached
T1_dmn<-ggordiplots::gg_ordiplot(ord = ord_t1_dmn, groups = data.frame(sample_data(subset_samples(ps_dmn, Time == "T1")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T1_dmn$plot + theme_classic()

ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_dmn_T1.pdf")
Saving 7.29 x 4.51 in image

ord_t2_dmn<-ordinate(physeq = subset_samples(ps_dmn, Time=="T2"), method = "NMDS", distance = "bray", k=3, trymax= 100)
Run 0 stress 0.1325262 
Run 1 stress 0.1325269 
... Procrustes: rmse 0.0001074309  max resid 0.000408716 
... Similar to previous best
Run 2 stress 0.1325262 
... New best solution
... Procrustes: rmse 0.001015874  max resid 0.005488789 
... Similar to previous best
Run 3 stress 0.1327962 
... Procrustes: rmse 0.01038273  max resid 0.06195753 
Run 4 stress 0.1338926 
Run 5 stress 0.1392078 
Run 6 stress 0.1338929 
Run 7 stress 0.1325264 
... Procrustes: rmse 0.001066291  max resid 0.005401677 
... Similar to previous best
Run 8 stress 0.1325261 
... New best solution
... Procrustes: rmse 0.0001868934  max resid 0.001066974 
... Similar to previous best
Run 9 stress 0.1334238 
Run 10 stress 0.1325259 
... New best solution
... Procrustes: rmse 0.0007505591  max resid 0.004597761 
... Similar to previous best
Run 11 stress 0.132925 
... Procrustes: rmse 0.01264762  max resid 0.07728014 
Run 12 stress 0.1438152 
Run 13 stress 0.132526 
... Procrustes: rmse 0.0003451055  max resid 0.001743723 
... Similar to previous best
Run 14 stress 0.1325259 
... Procrustes: rmse 0.0003370863  max resid 0.00167214 
... Similar to previous best
Run 15 stress 0.1334866 
Run 16 stress 0.1325266 
... Procrustes: rmse 0.0009514394  max resid 0.005508805 
... Similar to previous best
Run 17 stress 0.1325265 
... Procrustes: rmse 0.0008955128  max resid 0.005161325 
... Similar to previous best
Run 18 stress 0.1449845 
Run 19 stress 0.1342762 
Run 20 stress 0.1325263 
... Procrustes: rmse 0.0003284059  max resid 0.001374251 
... Similar to previous best
*** Solution reached
T2_dmn<-ggordiplots::gg_ordiplot(ord = ord_t2_dmn, groups = data.frame(sample_data(subset_samples(ps_dmn, Time == "T2")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T2_dmn$plot + theme_classic()
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_dmn_T2.pdf")
Saving 7.29 x 4.51 in image

#this time point needs to be checked out. The ordination is not working properly. 
ord_t3_dmn<-ordinate(physeq = subset_samples(ps_dmn, Time=="T3"), method = "NMDS", distance = "bray", k=3, trymax= 100)
Run 0 stress 0.1451733 
Run 1 stress 0.1459287 
Run 2 stress 0.1510555 
Run 3 stress 0.1501906 
Run 4 stress 0.1503806 
Run 5 stress 0.1459215 
Run 6 stress 0.1528692 
Run 7 stress 0.1451733 
... Procrustes: rmse 0.00281782  max resid 0.01088482 
Run 8 stress 0.1502075 
Run 9 stress 0.1507344 
Run 10 stress 0.1478567 
Run 11 stress 0.1490906 
Run 12 stress 0.1451724 
... New best solution
... Procrustes: rmse 0.0002730257  max resid 0.001361369 
... Similar to previous best
Run 13 stress 0.1507808 
Run 14 stress 0.146477 
Run 15 stress 0.1510089 
Run 16 stress 0.1507665 
Run 17 stress 0.1518463 
Run 18 stress 0.1459425 
Run 19 stress 0.1451714 
... New best solution
... Procrustes: rmse 0.001928599  max resid 0.006972218 
... Similar to previous best
Run 20 stress 0.1459215 
*** Solution reached
T3_dmn<-ggordiplots::gg_ordiplot(ord = ord_t3_dmn, groups = data.frame(sample_data(subset_samples(ps_dmn, Time == "T3")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T3_dmn$plot + theme_classic()
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_dmn_T3.pdf")
Saving 7.29 x 4.51 in image

Ordination plots on rarefied data by time point.

ord_t1_rare<-ordinate(physeq = subset_samples(ps_rare_sub, Time=="T1"), method = "NMDS", distance = "bray", k=3, trymax= 100)
Square root transformation
Wisconsin double standardization
Run 0 stress 0.15407 
Run 1 stress 0.1540701 
... Procrustes: rmse 0.0004569647  max resid 0.001896947 
... Similar to previous best
Run 2 stress 0.1560276 
Run 3 stress 0.1540705 
... Procrustes: rmse 0.00348766  max resid 0.02182018 
Run 4 stress 0.1560277 
Run 5 stress 0.158209 
Run 6 stress 0.1586751 
Run 7 stress 0.1545097 
... Procrustes: rmse 0.01243307  max resid 0.04244993 
Run 8 stress 0.1540702 
... Procrustes: rmse 0.003479511  max resid 0.02173529 
Run 9 stress 0.1543042 
... Procrustes: rmse 0.01763231  max resid 0.08581444 
Run 10 stress 0.1541252 
... Procrustes: rmse 0.007485728  max resid 0.03683984 
Run 11 stress 0.1540706 
... Procrustes: rmse 0.003606795  max resid 0.02250138 
Run 12 stress 0.1548484 
Run 13 stress 0.1541275 
... Procrustes: rmse 0.00762305  max resid 0.03699455 
Run 14 stress 0.1543157 
... Procrustes: rmse 0.01699931  max resid 0.07997088 
Run 15 stress 0.1560286 
Run 16 stress 0.1560286 
Run 17 stress 0.1581542 
Run 18 stress 0.1540702 
... Procrustes: rmse 0.003594385  max resid 0.02243185 
Run 19 stress 0.1550319 
Run 20 stress 0.1560267 
*** Best solution repeated 1 times
T1_rare<-ggordiplots::gg_ordiplot(ord = ord_t1_rare, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T1")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T1_rare$plot + theme_classic()

T1_rare<-ggordiplots::gg_ordiplot(ord = ord_t1_rare, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T1")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T1_rare_plot<-T1_rare$plot + theme_classic() + xlim(-0.5, 0.5) + ylim(-0.5, 0.5)  + guides(color=guide_legend("Treatment")) + xlab("NMDS 1") + ylab("NMDS 2")
T1_rare_plot
Warning: Removed 3 rows containing missing values (`geom_point()`).

library(cowplot)
my_legend <- get_legend(T1_rare_plot)
Warning: Removed 3 rows containing missing values (`geom_point()`).
library(ggpubr)
as_ggplot(my_legend)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordinationlegend.pdf")
Saving 7.29 x 4.51 in image
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordinationlegend.eps")
Saving 7.29 x 4.51 in image

T1_rare_plot<-T1_rare_plot + theme(legend.position = "none")
T1_rare_plot
Warning: Removed 3 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T1.pdf")
Saving 7.29 x 4.51 in image
Warning: Removed 3 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T1.eps")
Saving 7.29 x 4.51 in image
Warning: Removed 3 rows containing missing values (`geom_point()`).

ord_t2_rare<-ordinate(physeq = subset_samples(ps_rare_sub, Time=="T2"), method = "NMDS", distance = "bray", k=3, trymax= 100)
Square root transformation
Wisconsin double standardization
Run 0 stress 0.1716481 
Run 1 stress 0.1720658 
... Procrustes: rmse 0.04180674  max resid 0.1226574 
Run 2 stress 0.1720724 
... Procrustes: rmse 0.0407305  max resid 0.1223211 
Run 3 stress 0.1701444 
... New best solution
... Procrustes: rmse 0.08690941  max resid 0.2978527 
Run 4 stress 0.1709893 
Run 5 stress 0.1711196 
Run 6 stress 0.1728237 
Run 7 stress 0.1708441 
Run 8 stress 0.1706909 
Run 9 stress 0.1706258 
... Procrustes: rmse 0.06561966  max resid 0.2792094 
Run 10 stress 0.171183 
Run 11 stress 0.1746478 
Run 12 stress 0.1746525 
Run 13 stress 0.1709914 
Run 14 stress 0.1734335 
Run 15 stress 0.1710644 
Run 16 stress 0.1710837 
Run 17 stress 0.1702885 
... Procrustes: rmse 0.05689984  max resid 0.2828329 
Run 18 stress 0.1734279 
Run 19 stress 0.1715313 
Run 20 stress 0.1713459 
Run 21 stress 0.1729146 
Run 22 stress 0.1736516 
Run 23 stress 0.1703011 
... Procrustes: rmse 0.05756458  max resid 0.2826533 
Run 24 stress 0.170112 
... New best solution
... Procrustes: rmse 0.005398775  max resid 0.02579526 
Run 25 stress 0.1702884 
... Procrustes: rmse 0.05862291  max resid 0.2821017 
Run 26 stress 0.1706282 
Run 27 stress 0.172058 
Run 28 stress 0.174658 
Run 29 stress 0.1706231 
Run 30 stress 0.1702879 
... Procrustes: rmse 0.05856164  max resid 0.2821153 
Run 31 stress 0.1701561 
... Procrustes: rmse 0.005990811  max resid 0.02698447 
Run 32 stress 0.1715783 
Run 33 stress 0.1757041 
Run 34 stress 0.1709007 
Run 35 stress 0.1715863 
Run 36 stress 0.1742448 
Run 37 stress 0.1702882 
... Procrustes: rmse 0.05868747  max resid 0.2820668 
Run 38 stress 0.1702889 
... Procrustes: rmse 0.05873721  max resid 0.2820447 
Run 39 stress 0.1715866 
Run 40 stress 0.170299 
... Procrustes: rmse 0.05905885  max resid 0.2819334 
Run 41 stress 0.1709006 
Run 42 stress 0.1702394 
... Procrustes: rmse 0.01169203  max resid 0.03765 
Run 43 stress 0.1767481 
Run 44 stress 0.1720567 
Run 45 stress 0.1711196 
Run 46 stress 0.1703014 
... Procrustes: rmse 0.05919363  max resid 0.2818825 
Run 47 stress 0.1709005 
Run 48 stress 0.1703017 
... Procrustes: rmse 0.05921868  max resid 0.2818621 
Run 49 stress 0.1709909 
Run 50 stress 0.1745794 
Run 51 stress 0.1709004 
Run 52 stress 0.1710641 
Run 53 stress 0.1731 
Run 54 stress 0.1728168 
Run 55 stress 0.1706225 
Run 56 stress 0.1706709 
Run 57 stress 0.1732789 
Run 58 stress 0.1711185 
Run 59 stress 0.1702091 
... Procrustes: rmse 0.009167803  max resid 0.02910266 
Run 60 stress 0.1703042 
... Procrustes: rmse 0.05940232  max resid 0.2817527 
Run 61 stress 0.1701124 
... Procrustes: rmse 0.0009526391  max resid 0.002988642 
... Similar to previous best
*** Best solution repeated 1 times
T2_rare<-ggordiplots::gg_ordiplot(ord = ord_t2_rare, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T2")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T2_rare_plot<-T2_rare$plot + theme_classic() + xlim(-0.5, 0.5) + ylim(-0.5, 0.5) + theme(legend.position = "none")  + xlab("NMDS 1") + ylab("NMDS 2")
T2_rare_plot
Warning: Removed 4 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T2.pdf")
Saving 7.29 x 4.51 in image
Warning: Removed 4 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T2.eps")
Saving 7.29 x 4.51 in image
Warning: Removed 4 rows containing missing values (`geom_point()`).

ord_t3_rare<-ordinate(physeq = subset_samples(ps_rare, Time=="T3"), method = "NMDS", distance = "bray", k=3, trymax= 100)
Square root transformation
Wisconsin double standardization
Run 0 stress 0.1685562 
Run 1 stress 0.173731 
Run 2 stress 0.1770624 
Run 3 stress 0.1745126 
Run 4 stress 0.1722637 
Run 5 stress 0.1686696 
... Procrustes: rmse 0.01027886  max resid 0.05714972 
Run 6 stress 0.1722627 
Run 7 stress 0.1684508 
... New best solution
... Procrustes: rmse 0.01175199  max resid 0.06578898 
Run 8 stress 0.1786699 
Run 9 stress 0.1686779 
... Procrustes: rmse 0.02156585  max resid 0.130108 
Run 10 stress 0.1685888 
... Procrustes: rmse 0.01036983  max resid 0.05925135 
Run 11 stress 0.1769021 
Run 12 stress 0.1698586 
Run 13 stress 0.1798158 
Run 14 stress 0.1774968 
Run 15 stress 0.1723331 
Run 16 stress 0.1734184 
Run 17 stress 0.1704177 
Run 18 stress 0.1686749 
... Procrustes: rmse 0.02108582  max resid 0.1271145 
Run 19 stress 0.1686812 
... Procrustes: rmse 0.02201686  max resid 0.1329718 
Run 20 stress 0.1684506 
... New best solution
... Procrustes: rmse 0.0001109389  max resid 0.0005559503 
... Similar to previous best
*** Best solution repeated 1 times
T3_rare<-ggordiplots::gg_ordiplot(ord = ord_t3_rare, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T3")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T3_rare_plot<-T3_rare$plot + theme_classic() + xlim(-0.5, 0.5) + ylim(-0.5, 0.5) + theme(legend.position = "none")  + xlab("NMDS 1") + ylab("NMDS 2")
T3_rare_plot
Warning: Removed 4 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T3.pdf")
Saving 7.29 x 4.51 in image
Warning: Removed 4 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T3.eps")
Saving 7.29 x 4.51 in image
Warning: Removed 4 rows containing missing values (`geom_point()`).

library(ggpubr)
ggarrange(T1_rare_plot, T2_rare_plot, T3_rare_plot, ncol = 1)
Warning: Removed 3 rows containing missing values (`geom_point()`).
Warning: Removed 4 rows containing missing values (`geom_point()`).
Warning: Removed 4 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_combined_ordination.pdf", width = 5, height = 10)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_combined_ordination.eps", width = 5, height = 10)

CAP ordination plots rarefied

t1_dist <- distance(subset_samples(ps_rare, Time=="T1"), method="bray") #get wUnifrac and save
t1_table<-as.matrix(dist(t1_dist)) #transform wUnifrac index
ord_t1_rare_cap <- capscale(t1_table ~ Herbicide, data.frame(sample_data(subset_samples(ps_rare, Time == "T1"))))
T1_rare<-ggordiplots::gg_ordiplot(ord = ord_t1_rare_cap, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T1")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)
T1_rare$plot + theme_classic()
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T1_cap.pdf")


t2_dist <- distance(subset_samples(ps_rare, Time=="T2"), method="bray") #get wUnifrac and save
t2_table<-as.matrix(dist(t2_dist)) #transform wUnifrac index
ord_t2_rare_cap <- capscale(t2_table ~ Herbicide, data.frame(sample_data(subset_samples(ps_rare, Time == "T2"))))
T2_rare<-ggordiplots::gg_ordiplot(ord = ord_t2_rare_cap, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T2")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)
T2_rare$plot + theme_classic()
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T2_cap.pdf")


#G166SG identified as outlier based on plots with it included. Removed to create plot. 
ps_rare <-  subset_samples(ps_rare, sample_names(ps_rare) != "G166SG")
t3_dist <- distance(subset_samples(ps_rare, Time=="T3"), method="bray") #get wUnifrac and save
t3_table<-as.matrix(dist(t3_dist)) #transform wUnifrac index
ord_t3_rare_cap <- capscale(t3_table ~ Herbicide, data.frame(sample_data(subset_samples(ps_rare, Time == "T3"))))
T3_rare<-ggordiplots::gg_ordiplot(ord = ord_t3_rare_cap, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T3")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)
T3_rare$plot + theme_classic()
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T3_cap.pdf")

Pairwise adonis testing no needed becasue of insignificant gloabal test.

ps_pairwiseadonis<-function(physeq){
  otu_tab<-data.frame(phyloseq::otu_table(physeq))
  md_tab<-data.frame(phyloseq::sample_data(physeq))
    if(taxa_are_rows(physeq)== T){
       physeq_dist<-parallelDist::parDist(as.matrix(t(otu_tab)), method = "bray")}
            else{physeq_dist<-parallelDist::parDist(as.matrix(otu_tab), method = "bray")}
pairwiseAdonis::pairwise.adonis(x = physeq_dist, factors = md_tab$Herbicide, p.adjust.m = "none", perm = 1000)
}

ps_t1<-subset_samples(ps_rare_sub, Time == "T1")
ps_t1<-prune_taxa(taxa_sums(ps_t1) > 2, ps_t1)

ps_t2<-subset_samples(ps_rare_sub, Time == "T2")
ps_t2<-prune_taxa(taxa_sums(ps_t2) > 2, ps_t2)

ps_t3<-subset_samples(ps_rare_sub, Time == "T3")
ps_t3<-prune_taxa(taxa_sums(ps_t3) > 2, ps_t3)


ps_pairwiseadonis(ps_t1)
ps_pairwiseadonis(ps_t2)
ps_pairwiseadonis(ps_t3)

Pairwise betadispr by treatment, time and mode

ps_betadispr<-function(physeq, groupingvar = "Groupingvar"){
  otu_tab<-data.frame(phyloseq::otu_table(physeq))
  md_tab<-data.frame(phyloseq::sample_data(physeq))
    if(taxa_are_rows(physeq)== T){
       physeq_dist<-parallelDist::parDist(as.matrix(t(otu_tab)), method = "bray")}
            else{physeq_dist<-parallelDist::parDist(as.matrix(otu_tab), method = "bray")}
                mod<-vegan::betadisper(physeq_dist, md_tab[,groupingvar])
        ## Perform test
                print(anova(mod))
        ## Permutation test for F
                pmod <- vegan::permutest(mod, permutations = 1000, pairwise = TRUE)
                print(pmod)
                print(boxplot(mod))
}

permute test of dispersion

ps_betadispr(subset_samples(ps_rare_sub, Time == "T3"), groupingvar = "Herbicide")
Analysis of Variance Table

Response: Distances
          Df  Sum Sq   Mean Sq F value Pr(>F)
Groups     4 0.00635 0.0015867  0.1932 0.9408
Residuals 48 0.39424 0.0082133               

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 1000

Response: Distances
          Df  Sum Sq   Mean Sq      F N.Perm Pr(>F)
Groups     4 0.00635 0.0015867 0.1932   1000 0.9451
Residuals 48 0.39424 0.0082133                     

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
                    Atrazine-Mesotrione Dicamba Glyphosate Handweeded Non-Treated
Atrazine-Mesotrione                     0.93007    0.53946    0.86913      0.7502
Dicamba                         0.92524            0.42557    0.73726      0.5854
Glyphosate                      0.54158 0.42422               0.62537      0.7832
Handweeded                      0.84582 0.73548    0.61029                 0.8442
Non-Treated                     0.71761 0.59620    0.77349    0.82944            
$stats
          [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 0.2201596 0.2491324 0.1949060 0.2643697 0.2208840
[2,] 0.2635563 0.2905369 0.2531917 0.2745103 0.2571909
[3,] 0.2896573 0.3043022 0.2848346 0.3109094 0.2923035
[4,] 0.3593706 0.3524222 0.3591617 0.3254448 0.3874820
[5,] 0.4966550 0.3757590 0.4464053 0.3722896 0.4658206

$n
[1] 12  9 11 11 10

$conf
          [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 0.2459558 0.2717092 0.2343518 0.2866449 0.2272048
[2,] 0.3333588 0.3368951 0.3353175 0.3351740 0.3574021

$out
   G141SG    G146SG    G144SG 
0.6092207 0.5282037 0.5427749 

$group
[1] 1 2 4

$names
[1] "Atrazine-Mesotrione" "Dicamba"             "Glyphosate"          "Handweeded"         
[5] "Non-Treated"        

beta_boxplot<-function (physeq, method = "bray", group) 
{
  require("phyloseq")
  require("ggplot2")
  group2samp <- list()
  group_list <- get_variable(sample_data(physeq), group)
  for (groups in levels(group_list)) {
    target_group <- which(group_list == groups)
    group2samp[[groups]] <- sample_names(physeq)[target_group]
  }
  beta_div_dist <- phyloseq::distance(physeq = physeq, method = method)
  beta_div_dist <- as(beta_div_dist, "matrix")
  dist_df <- data.frame()
  counter <- 1
  for (groups in names(group2samp)) {
    sub_dist <- beta_div_dist[group2samp[[groups]], group2samp[[groups]]]
    no_samp_col <- ncol(sub_dist)
    no_samp_row <- nrow(sub_dist)
    for (cols in seq(no_samp_col)) {
      if (cols > 1) {
        for (rows in seq((cols - 1))) {
          dist_df[counter, "sample_pair"] <- paste0(colnames(sub_dist)[cols], 
            "-", rownames(sub_dist)[rows])
          dist_df[counter, "group"] <- groups
          dist_df[counter, "beta_div_method"] <- method
          dist_df[counter, "beta_div_value"] <- sub_dist[rows, 
            cols]
          counter = counter + 1
        }
      }
    }
  }
  plot_boxplot <- ggplot(data = dist_df, aes(x = group, y = beta_div_value, 
    color = group)) + geom_boxplot(outlier.shape = NA) + 
    geom_jitter() + theme_bw() + xlab(group) + ylab(method) + 
    theme(axis.text.x = element_text(angle = 45, vjust = 1, 
      hjust = 1))
  list_Out <- list(data = dist_df, plot = plot_boxplot)
  return(list_Out)
}

Box and whisker plots of distance within group distances

#remotes::install_github("antonioggsousa/micrUBIfuns")
#library(micrUBIfuns)
T1_beta<-beta_boxplot(physeq = subset_samples(ps_rare, Time=="T1"), method = "bray", group = "Herbicide")
T1_beta_plot <- T1_beta$plot
T1_beta_plot <- T1_beta_plot + theme_classic()+ guides(color=guide_legend("Treatment")) + ylab("Bray-Curtis Dissimilarity") + xlab("") + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylim (0.3, 0.75)
T1_beta_plot
Warning: Removed 5 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 5 rows containing missing values (`geom_point()`).

my_legend <- get_legend(T1_beta_plot)
Warning: Removed 5 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 5 rows containing missing values (`geom_point()`).
as_ggplot(my_legend)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_beta_legend.pdf")
Saving 7.29 x 4.51 in image
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_beta_legend.eps")
Saving 7.29 x 4.51 in image

T1_beta_plot<-T1_beta_plot+ theme(legend.position = "none") 
T1_beta_plot
Warning: Removed 5 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 5 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T1_rare_withingroup_beta.pdf")
Saving 7.29 x 4.51 in image
Warning: Removed 5 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 5 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T1_rare_withingroup_beta.eps")
Saving 7.29 x 4.51 in image
Warning: Removed 5 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 5 rows containing missing values (`geom_point()`).

T1_beta_df<- T1_beta$data
T1_betamod<-aov(formula = beta_div_value ~ group ,data = T1_beta_df)
summary(T1_betamod)
             Df Sum Sq Mean Sq F value  Pr(>F)    
group         4 0.2967 0.07419    8.83 1.1e-06 ***
Residuals   250 2.1003 0.00840                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
TukeyHSD(x = T1_betamod, which = "group")
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = beta_div_value ~ group, data = T1_beta_df)

$group
                                        diff         lwr          upr     p adj
Dicamba-Atrazine-Mesotrione     -0.027993939 -0.07861966  0.022631781 0.5508308
Glyphosate-Atrazine-Mesotrione  -0.036412121 -0.08703784  0.014213599 0.2806138
Handweeded-Atrazine-Mesotrione  -0.058666667 -0.11176337 -0.005569963 0.0220819
Non-Treated-Atrazine-Mesotrione  0.040006061 -0.01061966  0.090631781 0.1940292
Glyphosate-Dicamba              -0.008418182 -0.05644596  0.039609594 0.9889807
Handweeded-Dicamba              -0.030672727 -0.08129845  0.019952993 0.4576855
Non-Treated-Dicamba              0.068000000  0.01997222  0.116027775 0.0012035
Handweeded-Glyphosate           -0.022254545 -0.07288027  0.028371175 0.7468226
Non-Treated-Glyphosate           0.076418182  0.02839041  0.124445957 0.0001747
Non-Treated-Handweeded           0.098672727  0.04804701  0.149298448 0.0000019
T2_beta<-beta_boxplot(physeq = subset_samples(ps_rare, Time=="T2"), method = "bray", group = "Herbicide")
T2_beta_plot <- T2_beta$plot
T2_beta_plot <- T2_beta_plot+ theme_classic() + theme(legend.position = "none") + ylab("Bray-Curtis Dissimilarity") + xlab("") + ggtitle("") + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylim (0.3, 0.75)
T2_beta_plot
Warning: Removed 1 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 2 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T2_rare_withingroup_beta.pdf")
Saving 7.29 x 4.51 in image
Warning: Removed 1 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 2 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T2_rare_withingroup_beta.eps")
Saving 7.29 x 4.51 in image
Warning: Removed 1 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 2 rows containing missing values (`geom_point()`).

T2_beta_df<- T2_beta$data
T2_betamod<-aov(formula = beta_div_value ~ group ,data = T2_beta_df)
summary(T2_betamod)
             Df Sum Sq  Mean Sq F value  Pr(>F)   
group         4  0.080 0.019995   4.367 0.00201 **
Residuals   231  1.058 0.004578                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
TukeyHSD(x = T2_betamod, which = "group")
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = beta_div_value ~ group, data = T2_beta_df)

$group
                                        diff          lwr           upr     p adj
Dicamba-Atrazine-Mesotrione     -0.029188889 -0.070787897  0.0124101197 0.3048204
Glyphosate-Atrazine-Mesotrione  -0.020375758 -0.057770485  0.0170189703 0.5647456
Handweeded-Atrazine-Mesotrione   0.022206061 -0.015188667  0.0596007884 0.4780643
Non-Treated-Atrazine-Mesotrione -0.015555556 -0.054775477  0.0236643659 0.8113359
Glyphosate-Dicamba               0.008813131 -0.031069709  0.0486959716 0.9738007
Handweeded-Dicamba               0.051394949  0.011512109  0.0912777898 0.0043255
Non-Treated-Dicamba              0.013633333 -0.027965675  0.0552323419 0.8962631
Handweeded-Glyphosate            0.042581818  0.007106064  0.0780575719 0.0097763
Non-Treated-Glyphosate           0.004820202 -0.032574526  0.0422149299 0.9966025
Non-Treated-Handweeded          -0.037761616 -0.075156344 -0.0003668883 0.0465006
T3_beta<-beta_boxplot(physeq = subset_samples(ps_rare, Time=="T3"), method = "bray", group = "Herbicide") 
T3_beta$plot #+ scale_color_manual(values = c("#F8766D", "#A3A500",  "#00BF7D", "#00B0F6", "#E76BF3")) + 
T3_beta_plot <- T3_beta$plot
T3_beta_plot <- T3_beta_plot + theme_classic()+ theme(legend.position = "none") + ylab("Bray-Curtis Dissimilarity") + xlab("") + ggtitle("")
T3_beta_plot <-T3_beta_plot + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylim (0.3, 0.75)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T3_rare_withingroup_beta.pdf")
Saving 7.29 x 4.51 in image
Warning: Removed 1 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 1 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T3_rare_withingroup_beta.eps")
Saving 7.29 x 4.51 in image
Warning: Removed 1 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 1 rows containing missing values (`geom_point()`).

T3_beta_df<- T3_beta$data
T3_betamod<-aov(formula = beta_div_value ~ group ,data = T3_beta_df)
summary(T3_betamod)
             Df Sum Sq  Mean Sq F value Pr(>F)
group         4 0.0672 0.016792   1.689  0.153
Residuals   252 2.5054 0.009942               
TukeyHSD(x = T3_betamod, which = "group")
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = beta_div_value ~ group, data = T3_beta_df)

$group
                                        diff         lwr        upr     p adj
Dicamba-Atrazine-Mesotrione      0.009452020 -0.04731207 0.06621612 0.9909320
Glyphosate-Atrazine-Mesotrione  -0.037518182 -0.08753732 0.01250096 0.2404830
Handweeded-Atrazine-Mesotrione  -0.014736364 -0.06475550 0.03528278 0.9275528
Non-Treated-Atrazine-Mesotrione -0.023409091 -0.07637301 0.02955483 0.7430333
Glyphosate-Dicamba              -0.046970202 -0.10570358 0.01176317 0.1840580
Handweeded-Dicamba              -0.024188384 -0.08292176 0.03454499 0.7896781
Non-Treated-Dicamba             -0.032861111 -0.09412180 0.02839957 0.5804264
Handweeded-Glyphosate            0.022781818 -0.02946147 0.07502511 0.7524585
Non-Treated-Glyphosate           0.014109091 -0.04096017 0.06917835 0.9554583
Non-Treated-Handweeded          -0.008672727 -0.06374199 0.04639653 0.9926689
library(ggpubr)
ggarrange(T1_beta_plot, T2_beta_plot, T3_beta_plot, ncol = 1)
Warning: Removed 5 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 5 rows containing missing values (`geom_point()`).
Warning: Removed 1 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 1 rows containing missing values (`geom_point()`).
Warning: Removed 1 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 1 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_combined_rare_within_group_beta.pdf", width = 7, height = 10)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_combined_rare_within_group_beta.eps", width = 7, height = 10)

Examination of dissimilarity across time points by treatment and then again by all chemical treatments combined.

T1_beta_df$Time<-"T1"
T2_beta_df$Time<-"T2"
T3_beta_df$Time<-"T3"


beta_div_T1_T2_T3 <- rbind(T1_beta_df, T2_beta_df, T3_beta_df)

beta_anova<-function(data, Herbicide = "Herbicide"){
  df_sub<- data %>% filter(group == Herbicide)
  mod<-aov(beta_div_value ~ Time, data = df_sub)
  print(summary(mod))
  print(TukeyHSD(mod, "Time"))
  boxplot(df_sub$beta_div_value ~ df_sub$Time)
}

#beta_anova(beta_div_T1_T2_T3, Herbicide = "Non-Treated")
#beta_anova(beta_div_T1_T2_T3, Herbicide = "Handweeded")
#beta_anova(beta_div_T1_T2_T3, Herbicide = "Dicamba")
#beta_anova(beta_div_T1_T2_T3, Herbicide = "Atrazine-Mesotrione")
#beta_anova(beta_div_T1_T2_T3, Herbicide = "Glyphosate")

#regroup all chemical treatments together and rerun betadiv calcs within group. 
sample_data(ps_rare)$Mode<-sample_data(ps_rare)$Herbicide

index <- c("Dicamba", "Glyphosate", "Atrazine-Mesotrione", "Handweeded", "Non-Treated")
values <- c("Chemical", "Chemical", "Chemical", "Handweeded", "Non-Treated")

sample_data(ps_rare)$Mode<- as.factor(values[match(sample_data(ps_rare)$Mode, index)])

#+ scale_color_manual(values = c("#FFA500", "#00B0F6", "#E76BF3")) 


T1_beta_chemical_combined<-beta_boxplot(physeq = subset_samples(ps_rare, Time=="T1"), method = "bray", group = "Mode")
T1_beta_chemical_combined_plot <- T1_beta_chemical_combined$plot 
T1_beta_chemical_combined_plot<- T1_beta_chemical_combined_plot + theme_classic() + guides(color=guide_legend("Treatment")) + ylab("Bray-Curtis Dissimilarity") + xlab("") + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylim (0.3, 0.75) + scale_color_manual(values = c("#FFA500", "#00B0F6", "#E76BF3")) 
T1_beta_chemical_combined_plot
Warning: Removed 9 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 9 rows containing missing values (`geom_point()`).

my_legend <- get_legend(T1_beta_chemical_combined_plot)
Warning: Removed 9 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 10 rows containing missing values (`geom_point()`).
as_ggplot(my_legend)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_beta_combined_legend.pdf")
Saving 7.29 x 4.51 in image
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_beta_combined_legend.eps")
Saving 7.29 x 4.51 in image

T1_beta_chemical_combined_plot<-T1_beta_chemical_combined_plot+ theme(legend.position = "none")
T1_beta_chemical_combined_plot
Warning: Removed 9 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 10 rows containing missing values (`geom_point()`).

T2_beta_chemical_combined<-beta_boxplot(physeq = subset_samples(ps_rare, Time=="T2"), method = "bray", group = "Mode")
T2_beta_chemical_combined_plot <- T2_beta_chemical_combined$plot 
T2_beta_chemical_combined_plot<- T2_beta_chemical_combined_plot + theme_classic()+ theme(legend.position = "none") + ylab("Bray-Curtis Dissimilarity") + xlab("") + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylim (0.3, 0.75) + scale_color_manual(values = c("#FFA500", "#00B0F6", "#E76BF3")) 
T2_beta_chemical_combined_plot
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 3 rows containing missing values (`geom_point()`).

T3_beta_chemical_combined<-beta_boxplot(physeq = subset_samples(ps_rare, Time=="T3"), method = "bray", group = "Mode")
T3_beta_chemical_combined_plot <- T3_beta_chemical_combined$plot 
T3_beta_chemical_combined_plot<- T3_beta_chemical_combined_plot + theme_classic()+ theme(legend.position = "none") + ylab("Bray-Curtis Dissimilarity") + xlab("") + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylim (0.3, 0.75) + scale_color_manual(values = c("#FFA500", "#00B0F6", "#E76BF3")) 
T3_beta_chemical_combined_plot
Warning: Removed 5 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 5 rows containing missing values (`geom_point()`).

ggarrange(T1_beta_chemical_combined_plot, T2_beta_chemical_combined_plot, T3_beta_chemical_combined_plot, ncol = 1)
Warning: Removed 9 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 9 rows containing missing values (`geom_point()`).
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 4 rows containing missing values (`geom_point()`).
Warning: Removed 5 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 5 rows containing missing values (`geom_point()`).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_combined_rare_within_group_beta_chemical_combined.pdf", width = 5, height = 10)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_combined_rare_within_group_beta_chemical_combined.eps", width = 5, height = 10)


T1_beta_df_chemical_combined <- T1_beta_chemical_combined$data
T2_beta_df_chemical_combined<- T2_beta_chemical_combined$data
T3_beta_df_chemical_combined<- T3_beta_chemical_combined$data

T1_beta_df_chemical_combined$Time<-"T1"
T2_beta_df_chemical_combined$Time<-"T2"
T3_beta_df_chemical_combined$Time<-"T3"

m1<-aov(beta_div_value ~ group, data = T1_beta_df_chemical_combined)
summary(m1)
TukeyHSD(m1, "group")
boxplot(beta_div_value ~ group, data = T1_beta_df_chemical_combined)


m2<-aov(beta_div_value ~ group, data = T2_beta_df_chemical_combined)
summary(m2)
TukeyHSD(m2, "group")
boxplot(beta_div_value ~ group, data = T2_beta_df_chemical_combined)

m3<-aov(beta_div_value ~ group, data = T3_beta_df_chemical_combined)
summary(m3)
TukeyHSD(m3, "group")
boxplot(beta_div_value ~ group, data = T3_beta_df_chemical_combined)


beta_div__chemical_combined_T1_T2_T3 <- rbind(T1_beta_df_chemical_combined, T2_beta_df_chemical_combined, T3_beta_df_chemical_combined)

beta_anova(beta_div__chemical_combined_T1_T2_T3, Herbicide = "Chemical")
beta_anova(beta_div__chemical_combined_T1_T2_T3, Herbicide = "Hand")
beta_anova(beta_div__chemical_combined_T1_T2_T3, Herbicide = "Non-Treated")

treatment to control



plotDistances = function(p, m, s, d) {

  # calc distances
  wu = phyloseq::distance(p, m)
  wu.m = melt(as.matrix(wu))
  
  # remove self-comparisons
  wu.m = wu.m %>%
    filter(as.character(Var1) != as.character(Var2)) %>%
    mutate_if(is.factor,as.character)
  
  # get sample data (S4 error OK and expected)
  sd = data.frame(sample_data(p)) %>%
    select(s, d) %>%
    mutate_if(is.factor,as.character)
  sd$Herbicide <- factor(sd$Herbicide, levels = c("Non-Treated", "Hand", "Aatrex", "Clarity", "Roundup Powermax"))
  
  # combined distances with sample data
  colnames(sd) = c("Var1", "Type1")
  wu.sd = left_join(wu.m, sd, by = "Var1")
  
  colnames(sd) = c("Var2", "Type2")
  wu.sd = left_join(wu.sd, sd, by = "Var2")
  
  #remove this line to plot all comparisons. 
  wu.sd = wu.sd %>% filter(Type1 == "Hand" | Type1 == "Non-Treated")
  
  # plot
  ggplot(wu.sd, aes(x = Type2, y = value)) +
    theme_bw() +
    geom_point() +
    geom_boxplot(aes(color = ifelse(Type1 == Type2, "red", "black"))) +
    scale_color_identity() +
    facet_wrap(~ Type1, scales = "free_x") +
    theme(axis.text.x=element_text(angle = 45, hjust = 1, size = 5)) + 
    ggtitle(paste0("Distance Metric = ", m))
  
}
a<-plotDistances(p = subset_samples(physeq= ps_rare, Time=="T1"), m = "bray", s = "Barcode_ID_G", d = "Herbicide")
a <- a + ggtitle("Time 1 Bray-Curtis Dissimlarities")
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T1_rare_allgroup_beta.pdf")
b<-plotDistances(p = subset_samples(physeq= ps_rare, Time=="T2"), m = "bray", s = "Barcode_ID_G", d = "Herbicide")
b <-b + ggtitle("Time 2 Bray-Curtis Dissimlarities")
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T2_rare_allgroup_beta.pdf")
c<-plotDistances(p = subset_samples(physeq= ps_rare, Time=="T3"), m = "bray", s = "Barcode_ID_G", d = "Herbicide")
c<- c + ggtitle("Time 3 Bray-Curtis Dissimlarities")
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T3_rare_allgroup_beta.pdf")

library(ggpubr)
ggarrange(a, b, c, ncol = 1)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_combined_rare_allgroup_beta.pdf", width = 7, height = 12)

Taxon abundance bar plot

#create super long color vector
col_vector <- c("#000000", "#FFFF00", "#1CE6FF", "#FF34FF", "#FF4A46", "#008941", "#006FA6", "#A30059",
        "#FFDBE5", "#7A4900", "#0000A6", "#63FFAC", "#B79762", "#004D43", "#8FB0FF", "#997D87",
        "#5A0007", "#809693", "#FEFFE6", "#1B4400", "#4FC601", "#3B5DFF", "#4A3B53", "#FF2F80",
        "#61615A", "#BA0900", "#6B7900", "#00C2A0", "#FFAA92", "#FF90C9", "#B903AA", "#D16100",
        "#DDEFFF", "#000035", "#7B4F4B", "#A1C299", "#300018", "#0AA6D8", "#013349", "#00846F",
        "#372101", "#FFB500", "#C2FFED", "#A079BF", "#CC0744", "#C0B9B2", "#C2FF99", "#001E09",
        "#00489C", "#6F0062", "#0CBD66", "#EEC3FF", "#456D75", "#B77B68", "#7A87A1", "#788D66",
        "#885578", "#FAD09F", "#FF8A9A", "#D157A0", "#BEC459", "#456648", "#0086ED", "#886F4C",
        
        "#34362D", "#B4A8BD", "#00A6AA", "#452C2C", "#636375", "#A3C8C9", "#FF913F", "#938A81",
        "#575329", "#00FECF", "#B05B6F", "#8CD0FF", "#3B9700", "#04F757", "#C8A1A1", "#1E6E00",
        "#7900D7", "#A77500", "#6367A9", "#A05837", "#6B002C", "#772600", "#D790FF", "#9B9700",
        "#549E79", "#FFF69F", "#201625", "#72418F", "#BC23FF", "#99ADC0", "#3A2465", "#922329",
        "#5B4534", "#FDE8DC", "#404E55", "#0089A3", "#CB7E98", "#A4E804", "#324E72", "#6A3A4C",
        "#83AB58", "#001C1E", "#D1F7CE", "#004B28", "#C8D0F6", "#A3A489", "#806C66", "#222800",
        "#BF5650", "#E83000", "#66796D", "#DA007C", "#FF1A59", "#8ADBB4", "#1E0200", "#5B4E51",
        "#C895C5", "#320033", "#FF6832", "#66E1D3", "#CFCDAC", "#D0AC94", "#7ED379", "#012C58",
        
        "#7A7BFF", "#D68E01", "#353339", "#78AFA1", "#FEB2C6", "#75797C", "#837393", "#943A4D",
        "#B5F4FF", "#D2DCD5", "#9556BD", "#6A714A", "#001325", "#02525F", "#0AA3F7", "#E98176",
        "#DBD5DD", "#5EBCD1", "#3D4F44", "#7E6405", "#02684E", "#962B75", "#8D8546", "#9695C5",
        "#E773CE", "#D86A78", "#3E89BE", "#CA834E", "#518A87", "#5B113C", "#55813B", "#E704C4",
        "#00005F", "#A97399", "#4B8160", "#59738A", "#FF5DA7", "#F7C9BF", "#643127", "#513A01",
        "#6B94AA", "#51A058", "#A45B02", "#1D1702", "#E20027", "#E7AB63", "#4C6001", "#9C6966",
        "#64547B", "#97979E", "#006A66", "#391406", "#F4D749", "#0045D2", "#006C31", "#DDB6D0",
        "#7C6571", "#9FB2A4", "#00D891", "#15A08A", "#BC65E9", "#FFFFFE", "#C6DC99", "#203B3C",

        "#671190", "#6B3A64", "#F5E1FF", "#FFA0F2", "#CCAA35", "#374527", "#8BB400", "#797868",
        "#C6005A", "#3B000A", "#C86240", "#29607C", "#402334", "#7D5A44", "#CCB87C", "#B88183",
        "#AA5199", "#B5D6C3", "#A38469", "#9F94F0", "#A74571", "#B894A6", "#71BB8C", "#00B433",
        "#789EC9", "#6D80BA", "#953F00", "#5EFF03", "#E4FFFC", "#1BE177", "#BCB1E5", "#76912F",
        "#003109", "#0060CD", "#D20096", "#895563", "#29201D", "#5B3213", "#A76F42", "#89412E",
        "#1A3A2A", "#494B5A", "#A88C85", "#F4ABAA", "#A3F3AB", "#00C6C8", "#EA8B66", "#958A9F",
        "#BDC9D2", "#9FA064", "#BE4700", "#658188", "#83A485", "#453C23", "#47675D", "#3A3F00",
        "#061203", "#DFFB71", "#868E7E", "#98D058", "#6C8F7D", "#D7BFC2", "#3C3E6E", "#D83D66",

        "#2F5D9B", "#6C5E46", "#D25B88", "#5B656C", "#00B57F", "#545C46", "#866097", "#365D25",
        "#252F99", "#00CCFF", "#674E60", "#FC009C", "#92896B")
phylumGlommed <- tax_glom(ps_rare, "Phylum")

#t1
phylumGlommed_herb_t1 <- merge_samples(subset_samples(physeq= phylumGlommed, Time=="T1"), group = "Herbicide")
phylumGlommed_herb_t1 <- transform_sample_counts(phylumGlommed_herb_t1, function(OTU) OTU/sum(OTU))
sample_data(phylumGlommed_herb_t1)$Herbicide <- factor(sample_data(phylumGlommed_herb_t1)$Herbicide, levels = c(1, 2, 3, 4, 5), 
       labels = c("Non-Treated", "Hand", "Aatrex", "Clarity", "Roundup Powermax"))

plot_bar(phylumGlommed_herb_t1, x = "Herbicide", fill = "Phylum")  + theme_classic() + ggtitle("Proportional Taxon Abundances Time 1") +
theme(legend.position="bottom") + guides(fill=guide_legend(nrow=6)) + geom_bar(stat="identity") + theme(axis.text.x=element_text(angle = 45, hjust = 1, size = 5)) + 
scale_fill_manual(values = col_vector)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_Taxon_barplot_t1.pdf")

#t2
phylumGlommed_herb_t2 <- merge_samples(subset_samples(physeq= phylumGlommed, Time=="T2"), group = "Herbicide")
phylumGlommed_herb_t2 <- transform_sample_counts(phylumGlommed_herb_t2, function(OTU) OTU/sum(OTU))
sample_data(phylumGlommed_herb_t2)$Herbicide <- factor(sample_data(phylumGlommed_herb_t2)$Herbicide, levels = c(1, 2, 3, 4, 5), 
       labels = c("Non-Treated", "Hand", "Aatrex", "Clarity", "Roundup Powermax"))

plot_bar(phylumGlommed_herb_t2, x = "Herbicide", fill = "Phylum")  + theme_classic() + ggtitle("Proportional Taxon Abundances Time 1") +
theme(legend.position="bottom") + guides(fill=guide_legend(nrow=6)) + geom_bar(stat="identity") + theme(axis.text.x=element_text(angle = 45, hjust = 1, size = 5)) + 
scale_fill_manual(values = col_vector)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_Pt1/Figures/ITS_Taxon_barplot_t2.pdf")

#t3
phylumGlommed_herb_t3 <- merge_samples(subset_samples(physeq= phylumGlommed, Time=="T3"), group = "Herbicide")
phylumGlommed_herb_t3 <- transform_sample_counts(phylumGlommed_herb_t3, function(OTU) OTU/sum(OTU))
sample_data(phylumGlommed_herb_t3)$Herbicide <- factor(sample_data(phylumGlommed_herb_t3)$Herbicide, levels = c(1, 2, 3, 4, 5), 
       labels = c("Non-Treated", "Hand", "Aatrex", "Clarity", "Roundup Powermax"))

plot_bar(phylumGlommed_herb_t3, x = "Herbicide", fill = "Phylum")  + theme_classic() + ggtitle("Proportional Taxon Abundances Time 1") +
theme(legend.position="bottom") + guides(fill=guide_legend(nrow=6)) + geom_bar(stat="identity") + theme(axis.text.x=element_text(angle = 45, hjust = 1, size = 5)) + 
scale_fill_manual(values = col_vector)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_Pt1/Figures/ITS_Taxon_barplot_t3.pdf")

Combined herbicide and time bar plot

sample_data(ps_rare_sub)$herb_time<-paste(sample_data(ps_rare_sub)$Herbicide, sample_data(ps_rare_sub)$Time, sep = "_")
ps_rare_for_barplot <- prune_taxa(taxa_sums(ps_rare_sub) > 50, ps_rare_sub)
plot_bar(ps_rare_for_barplot, x= "herb_time", fill = "Family") + scale_fill_manual(values = col_vector) + geom_bar(stat="identity")
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_BarPlot_Herbicide_Time.pdf", width = 20, height = 11)

Linear modeling of abundant taxa

mod_abund(test, IV = "Time")
                   Df Sum Sq Mean Sq F value Pr(>F)  
matrix(data[, IV])  2  30.58  15.292   3.725 0.0378 *
Residuals          26 106.73   4.105                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
[1] "Dicamba"           "f.Coniochaetaceae"
                   Df Sum Sq Mean Sq F value  Pr(>F)   
matrix(data[, IV])  2  864.4   432.2   7.708 0.00207 **
Residuals          29 1626.0    56.1                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
[1] "Handweeded"           "f.Spizellomycetaceae"

                   Df Sum Sq Mean Sq F value Pr(>F)  
matrix(data[, IV])  2    805   402.7   3.351 0.0496 *
Residuals          28   3366   120.2                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
[1] "Non-Treated"          "f.Spizellomycetaceae"

                   Df Sum Sq Mean Sq F value Pr(>F)  
matrix(data[, IV])  2  397.2  198.58   4.159 0.0255 *
Residuals          30 1432.4   47.75                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
[1] "Glyphosate"          "f.Ceratobasidiaceae"

                   Df Sum Sq Mean Sq F value   Pr(>F)    
matrix(data[, IV])  2  204.1  102.03   9.469 0.000649 ***
Residuals          30  323.3   10.78                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
[1] "Glyphosate"           "f.Spizellomycetaceae"

LS0tCnRpdGxlOiAiSGVyYlB0MSAxNlMgRmlndXJlcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnJlcXVpcmUocGh5bG9zZXEpCnJlcXVpcmUodGlkeXZlcnNlKQpyZXF1aXJlKHBoeWxvc2VxKQpyZXF1aXJlKHJlc2hhcGUyKQpyZXF1aXJlKGRwbHlyKQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUobWljcm9iaW9tZSkKcmVxdWlyZSh2ZWdhbikKYGBgCgpMb2FkIGRhdGEKYGBge3J9CnBzX2RtbiA8LSByZWFkUkRTKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvZGF0YS9QaHlsb3NlcU9iamVjdHMvSVRTL0RNTl9lc3RzX0lUUy5SZGF0YSIpCnNhbXBsZV9kYXRhKHBzX2RtbikkSGVyYmljaWRlIDwtIGZhY3RvcihzYW1wbGVfZGF0YShwc19kbW4pJEhlcmJpY2lkZSwgbGV2ZWxzID0gYygiQWF0cmV4IiwgIkNsYXJpdHkiLCAiSGFuZCIsIk5vbi1UcmVhdGVkIiwiUm91bmR1cCBQb3dlcm1heCIpKQpzYW1wbGVfZGF0YShwc19kbW4pJGhlcmJfdGltZTwtcGFzdGUoc2FtcGxlX2RhdGEocHNfZG1uKSRIZXJiaWNpZGUsIHNhbXBsZV9kYXRhKHBzX2RtbikkVGltZSwgc2VwID0gIl8iKQoKI3JlZ3JvdXAgYWxsIGNoZW1pY2FsIHRyZWF0bWVudHMgdG9nZXRoZXIgYW5kIHJlcnVuIGJldGFkaXYgY2FsY3Mgd2l0aGluIGdyb3VwLiAKc2FtcGxlX2RhdGEocHNfZG1uKSRNb2RlPC1zYW1wbGVfZGF0YShwc19kbW4pJEhlcmJpY2lkZQoKaW5kZXggPC0gYygiQ2xhcml0eSIsICJSb3VuZHVwIFBvd2VybWF4IiwgIkFhdHJleCIsICJIYW5kIiwgIk5vbi1UcmVhdGVkIikKdmFsdWVzIDwtIGMoIkNoZW1pY2FsIiwgIkNoZW1pY2FsIiwgIkNoZW1pY2FsIiwgIkhhbmQiLCAiTm9uLVRyZWF0ZWQiKQoKc2FtcGxlX2RhdGEocHNfZG1uKSRNb2RlPC0gYXMuZmFjdG9yKHZhbHVlc1ttYXRjaChzYW1wbGVfZGF0YShwc19kbW4pJE1vZGUsIGluZGV4KV0pCgppbmRleCA8LSBjKCJDbGFyaXR5IiwgIlJvdW5kdXAgUG93ZXJtYXgiLCAiQWF0cmV4IiwgIkhhbmQiLCAiTm9uLVRyZWF0ZWQiKQp2YWx1ZXMgPC0gYygiRGljYW1iYSIsICJHbHlwaG9zYXRlIiwgIkF0cmF6aW5lLU1lc290cmlvbmUiLCAiSGFuZHdlZWRlZCIsICJOb24tVHJlYXRlZCIpCgpzYW1wbGVfZGF0YShwc19kbW4pJEhlcmJpY2lkZSA8LSBhcy5mYWN0b3IodmFsdWVzW21hdGNoKHNhbXBsZV9kYXRhKHBzX2RtbikkSGVyYmljaWRlLCBpbmRleCldKQoKCnBzX3JhcmUgPC0gcmVhZFJEUygiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL2RhdGEvUGh5bG9zZXFPYmplY3RzL0lUUy9IZXJiUHQxX3JhcmVfSVRTLlJkYXRhIikKc2FtcGxlX2RhdGEocHNfcmFyZSkkSGVyYmljaWRlIDwtIGZhY3RvcihzYW1wbGVfZGF0YShwc19yYXJlKSRIZXJiaWNpZGUsIGxldmVscyA9IGMoIkFhdHJleCIsICJDbGFyaXR5IiwgIkhhbmQiLCJOb24tVHJlYXRlZCIsIlJvdW5kdXAgUG93ZXJtYXgiKSkKc2FtcGxlX2RhdGEocHNfcmFyZSkkaGVyYl90aW1lPC1wYXN0ZShzYW1wbGVfZGF0YShwc19yYXJlKSRIZXJiaWNpZGUsIHNhbXBsZV9kYXRhKHBzX3JhcmUpJFRpbWUsIHNlcCA9ICJfIikKCgojcmVncm91cCBhbGwgY2hlbWljYWwgdHJlYXRtZW50cyB0b2dldGhlciBhbmQgcmVydW4gYmV0YWRpdiBjYWxjcyB3aXRoaW4gZ3JvdXAuIApzYW1wbGVfZGF0YShwc19yYXJlKSRNb2RlPC1zYW1wbGVfZGF0YShwc19yYXJlKSRIZXJiaWNpZGUKCmluZGV4IDwtIGMoIkNsYXJpdHkiLCAiUm91bmR1cCBQb3dlcm1heCIsICJBYXRyZXgiLCAiSGFuZCIsICJOb24tVHJlYXRlZCIpCnZhbHVlcyA8LSBjKCJDaGVtaWNhbCIsICJDaGVtaWNhbCIsICJDaGVtaWNhbCIsICJIYW5kIiwgIk5vbi1UcmVhdGVkIikKCnNhbXBsZV9kYXRhKHBzX3JhcmUpJE1vZGU8LSBhcy5mYWN0b3IodmFsdWVzW21hdGNoKHNhbXBsZV9kYXRhKHBzX3JhcmUpJE1vZGUsIGluZGV4KV0pCgppbmRleCA8LSBjKCJDbGFyaXR5IiwgIlJvdW5kdXAgUG93ZXJtYXgiLCAiQWF0cmV4IiwgIkhhbmQiLCAiTm9uLVRyZWF0ZWQiKQp2YWx1ZXMgPC0gYygiRGljYW1iYSIsICJHbHlwaG9zYXRlIiwgIkF0cmF6aW5lLU1lc290cmlvbmUiLCAiSGFuZHdlZWRlZCIsICJOb24tVHJlYXRlZCIpCgpzYW1wbGVfZGF0YShwc19yYXJlKSRIZXJiaWNpZGUgPC0gYXMuZmFjdG9yKHZhbHVlc1ttYXRjaChzYW1wbGVfZGF0YShwc19yYXJlKSRIZXJiaWNpZGUsIGluZGV4KV0pCgoKcHNfdHJhbnMgPC0gcmVhZFJEUygiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL2RhdGEvUGh5bG9zZXFPYmplY3RzL0lUUy9IZXJiUHQxX2hlbF90cmFuc19JVFMuUmRhdGEiKQpzYW1wbGVfZGF0YShwc190cmFucykkSGVyYmljaWRlIDwtIGZhY3RvcihzYW1wbGVfZGF0YShwc190cmFucykkSGVyYmljaWRlLCBsZXZlbHMgPSBjKCJBYXRyZXgiLCAiQ2xhcml0eSIsICJIYW5kIiwiTm9uLVRyZWF0ZWQiLCJSb3VuZHVwIFBvd2VybWF4IikpCnNhbXBsZV9kYXRhKHBzX3RyYW5zKSRoZXJiX3RpbWU8LXBhc3RlKHNhbXBsZV9kYXRhKHBzX3RyYW5zKSRIZXJiaWNpZGUsIHNhbXBsZV9kYXRhKHBzX3RyYW5zKSRUaW1lLCBzZXAgPSAiXyIpCgoKI3JlZ3JvdXAgYWxsIGNoZW1pY2FsIHRyZWF0bWVudHMgdG9nZXRoZXIgYW5kIHJlcnVuIGJldGFkaXYgY2FsY3Mgd2l0aGluIGdyb3VwLiAKc2FtcGxlX2RhdGEocHNfdHJhbnMpJE1vZGU8LXNhbXBsZV9kYXRhKHBzX3RyYW5zKSRIZXJiaWNpZGUKCmluZGV4IDwtIGMoIkNsYXJpdHkiLCAiUm91bmR1cCBQb3dlcm1heCIsICJBYXRyZXgiLCAiSGFuZCIsICJOb24tVHJlYXRlZCIpCnZhbHVlcyA8LSBjKCJDaGVtaWNhbCIsICJDaGVtaWNhbCIsICJDaGVtaWNhbCIsICJIYW5kIiwgIk5vbi1UcmVhdGVkIikKCnNhbXBsZV9kYXRhKHBzX3RyYW5zKSRNb2RlPC0gYXMuZmFjdG9yKHZhbHVlc1ttYXRjaChzYW1wbGVfZGF0YShwc190cmFucykkTW9kZSwgaW5kZXgpXSkKCmluZGV4IDwtIGMoIkNsYXJpdHkiLCAiUm91bmR1cCBQb3dlcm1heCIsICJBYXRyZXgiLCAiSGFuZCIsICJOb24tVHJlYXRlZCIpCnZhbHVlcyA8LSBjKCJEaWNhbWJhIiwgIkdseXBob3NhdGUiLCAiQXRyYXppbmUtTWVzb3RyaW9uZSIsICJIYW5kd2VlZGVkIiwgIk5vbi1UcmVhdGVkIikKCnNhbXBsZV9kYXRhKHBzX3RyYW5zKSRIZXJiaWNpZGUgPC0gYXMuZmFjdG9yKHZhbHVlc1ttYXRjaChzYW1wbGVfZGF0YShwc190cmFucykkSGVyYmljaWRlLCBpbmRleCldKQpgYGAKClJlbW92ZSBzYW1wbGVzIHRoYXQgYXJlIG91dGxpbmVzIG9yIHVuZGVyIHNlcXVlbmNlZC4gCmBgYHtyfQpwc19kbW4gPC0gIHN1YnNldF9zYW1wbGVzKHBzX2Rtbiwgc2FtcGxlX25hbWVzKHBzX2RtbikgIT0gIkcwMDlTRyIpCnBzX2RtbiA8LSAgc3Vic2V0X3NhbXBsZXMocHNfZG1uLCBzYW1wbGVfbmFtZXMocHNfZG1uKSAhPSAiRzA5NVNHIikKcHNfZG1uIDwtICBzdWJzZXRfc2FtcGxlcyhwc19kbW4sIHNhbXBsZV9uYW1lcyhwc19kbW4pICE9ICJHMTIzU0ciKQpwc19kbW4gPC0gIHN1YnNldF9zYW1wbGVzKHBzX2Rtbiwgc2FtcGxlX25hbWVzKHBzX2RtbikgIT0gIkcxMjlTRyIpCgpwc19yYXJlIDwtICBzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBzYW1wbGVfbmFtZXMocHNfcmFyZSkgIT0gIkcwMDlTRyIpCnBzX3JhcmUgPC0gIHN1YnNldF9zYW1wbGVzKHBzX3JhcmUsIHNhbXBsZV9uYW1lcyhwc19yYXJlKSAhPSAiRzA5NVNHIikKcHNfcmFyZSA8LSAgc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgc2FtcGxlX25hbWVzKHBzX3JhcmUpICE9ICJHMTIzU0ciKQpwc19yYXJlIDwtICBzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBzYW1wbGVfbmFtZXMocHNfcmFyZSkgIT0gIkcxMjlTRyIpCnBzX3JhcmVfc3ViPC1wcnVuZV90YXhhKHRheGFfc3Vtcyhwc19yYXJlKSA+IDIsIHBzX3JhcmUpCmBgYAoKb3JkaW5hdGlvbnMgYW5kIGFkb25pcyB0ZXN0aW5nIHdpdGggdGhyZWUgc2VwYXJhdGUgb2JqZWN0cyAoaS5lLiwgZG1uLCByYXJlZmllZCwgdHJhbnNmb3JtZWQpLiBSYXJlIHRheGEgYXJlIHJlbW92ZWQgZnJvbSByYXJlZmllZCBhbmQgdHJhbnNmb3JtZWQgdG8gc3VjY2Vzc2Z1bGx5IG9yZGluYXRlLiBBdCB0aGlzIHBvaW50LCB0aGUgdHJhbnNmb3JtZWQgZGF0YSB3aWxsIG5vdCBvcmRpbmF0ZS4gVGhpcyBzZWN0aW9uIGlzIGZ1bGwgZGF0YXNldCBvcmRpbmF0aW9ucy4gCmBgYHtyfQoKb3JkX2Rtbjwtb3JkaW5hdGUocGh5c2VxID0gcHNfZG1uLCBtZXRob2QgPSAiTk1EUyIsIGRpc3RhbmNlID0gImJyYXkiLCBrPTMsIHRyeW1heD0gMzAwLCBtYXhpdCA9IDEwMDApCgpvcmRfcmFyZTwtb3JkaW5hdGUocGh5c2VxID0gcHNfcmFyZV9zdWIsIG1ldGhvZCA9ICJOTURTIiwgZGlzdGFuY2UgPSAiYnJheSIsIGs9MywgdHJ5bWF4PSAzMDAsIG1heGl0ID0gMTAwMCkKCnBzX3RyYW5zX3N1YjwtcHJ1bmVfdGF4YSh0YXhhX3N1bXMocHNfdHJhbnMpID4gMC4wMSwgcHNfdHJhbnMpCm9yZF90cmFuc2Zvcm1lZDwtb3JkaW5hdGUocGh5c2VxID0gcHNfdHJhbnNfc3ViLCBtZXRob2QgPSAiTk1EUyIsIGRpc3RhbmNlID0gImJyYXkiLCBrPTMsIHRyeW1heD0gMzAwLCBtYXhpdCA9IDEwMDApCmBgYAoKY3JlYXRlIGFscGhhZGl2ZXJzaXR5IHRhYmxlcwpgYGB7cn0Kc2FtcGxlX3N1bXMocHNfcmFyZSkKcHNfcmFyZQphbHBoYV9kaXYgPC0gZXN0aW1hdGVfcmljaG5lc3MocGh5c2VxID0gcHNfcmFyZSwgbWVhc3VyZXMgPSBjKCJPYnNlcnZlZCIsICJTaGFubm9uIiwgIkNoYW8xIikpCiNwdWxsIG91dCBtZXRhZGF0YSBhbmQgY29uY2F0b25hdGUgd2l0aCBhbHBoYSBkaXZlcnNpdHkgbWV0cmljcwptZDwtZGF0YS5mcmFtZShzYW1wbGVfZGF0YShwc19yYXJlKSkKYWxwaGFfZGl2X21kIDwtIHJvd25hbWVzX3RvX2NvbHVtbihhbHBoYV9kaXYsICJCYXJjb2RlX0lEX0ciKSAlPiUgZnVsbF9qb2luKG1kKSAKYWxwaGFfZGl2X21kJEhlcmJpY2lkZSA8LSBmYWN0b3IoYWxwaGFfZGl2X21kJEhlcmJpY2lkZSwgbGV2ZWxzID0gYygiTm9uLVRyZWF0ZWQiLCAiSGFuZHdlZWRlZCIsICJBdHJhemluZS1NZXNvdHJpb25lIiwgIkRpY2FtYmEiLCAiR2x5cGhvc2F0ZSIpKQpgYGAKCgoKU2hhbm5vbiBEaXYgcGxvdHMgLSBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBhbW9uZyBoZXJiaWNpZGUgdHJlYXRtZW50cyBhdCBhbnkgb2YgdGhlIHRocmVlIHRpbWUgcG9pbnRzCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGFscGhhX2Rpdl9tZCwgYWVzKEhlcmJpY2lkZSwgU2hhbm5vbiwgY29sb3I9IEhlcmJpY2lkZSkpICsgZmFjZXRfZ3JpZCguIH4gVGltZSkgKyBnZW9tX2JveHBsb3QoKSArIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkgKQoKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfU2hhbm5vbi5wZGYiKQoKYW92X3QxPC1hb3YoU2hhbm5vbiB+IEhlcmJpY2lkZSwgZGF0YSA9IGFscGhhX2Rpdl9tZFthbHBoYV9kaXZfbWQkVGltZSA9PSAiVDEiLF0pCnBsb3QoYW92X3QxJHJlc2lkdWFscykKc3VtbWFyeShhb3ZfdDEpCgphb3ZfdDI8LWFvdihTaGFubm9ufiBIZXJiaWNpZGUsIGRhdGEgPSBhbHBoYV9kaXZfbWRbYWxwaGFfZGl2X21kJFRpbWUgPT0gIlQyIixdKQpwbG90KGFvdl90MiRyZXNpZHVhbHMpCnN1bW1hcnkoYW92X3QyKQoKYW92X3QzPC1hb3YoU2hhbm5vbiB+IEhlcmJpY2lkZSwgZGF0YSA9IGFscGhhX2Rpdl9tZFthbHBoYV9kaXZfbWQkVGltZSA9PSAiVDMiLF0pCnBsb3QoYW92X3QzJHJlc2lkdWFscykKc3VtbWFyeShhb3ZfdDMpClR1a2V5SFNEKGFvdl90MywgIkhlcmJpY2lkZSIpCmBgYAoKCkFkb25pcyB0ZXN0aW5nIG9mIGhlcmJpY2lkZSB0cmVhdG1lbnRzIGJ5IHRpbWUgcG9pbnQKYGBge3J9CnBzX2Fkb25pczwtZnVuY3Rpb24ocGh5c2VxKXsKICBvdHVfdGFiPC1kYXRhLmZyYW1lKHBoeWxvc2VxOjpvdHVfdGFibGUocGh5c2VxKSkKICBtZF90YWI8LWRhdGEuZnJhbWUocGh5bG9zZXE6OnNhbXBsZV9kYXRhKHBoeXNlcSkpCiAgICBpZih0YXhhX2FyZV9yb3dzKHBoeXNlcSk9PSBUKXsKICAgICAgIHBoeXNlcV9kaXN0PC1wYXJhbGxlbERpc3Q6OnBhckRpc3QoYXMubWF0cml4KHQob3R1X3RhYikpLCBtZXRob2QgPSAiYnJheSIpfQogICAgICAgICAgICBlbHNle3BoeXNlcV9kaXN0PC1wYXJhbGxlbERpc3Q6OnBhckRpc3QoYXMubWF0cml4KG90dV90YWIpLCBtZXRob2QgPSAiYnJheSIpfQogIHByaW50KGFub3ZhKHZlZ2FuOjpiZXRhZGlzcGVyKHBoeXNlcV9kaXN0LCBtZF90YWIkSGVyYmljaWRlKSkpCiAgdmVnYW46OmFkb25pcyhwaHlzZXFfZGlzdCB+IEhlcmJpY2lkZSAqIFRpbWUgKyBUb3RhbF9XZWVkX1ZlZyAsIGRhdGEgPSBtZF90YWIsIHBlcm11dGF0aW9ucyA9IDEwMDApCn0KYGBgCgpgYGB7cn0KI3BzX2Fkb25pcyhwc19yYXJlX3N1YikKI3JlbW92ZSBvbmUgc2FtcGxlIHdpdGggbm8gdmVnZXRhdGlvbiBtZWFzdXJlbWVudC4gCnBzX3JhcmVfc3ViXzU3PC1zdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1Yiwgc2FtcGxlX25hbWVzKHBzX3JhcmVfc3ViKSAhPSAiRzA2NVNHIikKcHNfYWRvbmlzKHBzX3JhcmVfc3ViXzU3KQojcHNfYWRvbmlzKHBzX3RyYW5zX3N1YikKcHNfZG1uXzU3PC1zdWJzZXRfc2FtcGxlcyhwc19kbW4sIHNhbXBsZV9uYW1lcyhwc19kbW4pICE9ICJHMDY1U0ciKQojcHNfYWRvbmlzKHBzX2RtbikKcHNfYWRvbmlzKHBzX2Rtbl81NykKYGBgCgpPcmRpbmF0aW9uIHBsb3RzIERNTiBieSB0aW1lIHBvaW50CmBgYHtyfQpvcmRfdDFfZG1uPC1vcmRpbmF0ZShwaHlzZXEgPSBzdWJzZXRfc2FtcGxlcyhwc19kbW4sIFRpbWU9PSJUMSIpLCBtZXRob2QgPSAiTk1EUyIsIGRpc3RhbmNlID0gImJyYXkiLCBrPTMsIHRyeW1heD0gMTAwKQpUMV9kbW48LWdnb3JkaXBsb3RzOjpnZ19vcmRpcGxvdChvcmQgPSBvcmRfdDFfZG1uLCBncm91cHMgPSBkYXRhLmZyYW1lKHNhbXBsZV9kYXRhKHN1YnNldF9zYW1wbGVzKHBzX2RtbiwgVGltZSA9PSAiVDEiKSkpJEhlcmJpY2lkZSwgY2hvaWNlcyA9IGMoMSwgMiksIGtpbmQgPSBjKCJzZSIpLCBjb25mID0gMC45NSwgc2hvdy5ncm91cHMgPSAiYWxsIiwgZWxsaXBzZSA9IFRSVUUsIGxhYmVsID0gRkFMU0UsIGh1bGwgPSBGQUxTRSwgc3BpZGVycyA9IEZBTFNFLCBwbG90ID0gVFJVRSwgcHQuc2l6ZSA9IDEpClQxX2RtbiRwbG90ICsgdGhlbWVfY2xhc3NpYygpCgpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9uX2Rtbl9UMS5wZGYiKQoKb3JkX3QyX2Rtbjwtb3JkaW5hdGUocGh5c2VxID0gc3Vic2V0X3NhbXBsZXMocHNfZG1uLCBUaW1lPT0iVDIiKSwgbWV0aG9kID0gIk5NRFMiLCBkaXN0YW5jZSA9ICJicmF5Iiwgaz0zLCB0cnltYXg9IDEwMCkKVDJfZG1uPC1nZ29yZGlwbG90czo6Z2dfb3JkaXBsb3Qob3JkID0gb3JkX3QyX2RtbiwgZ3JvdXBzID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19kbW4sIFRpbWUgPT0gIlQyIikpKSRIZXJiaWNpZGUsIGNob2ljZXMgPSBjKDEsIDIpLCBraW5kID0gYygic2UiKSwgY29uZiA9IDAuOTUsIHNob3cuZ3JvdXBzID0gImFsbCIsIGVsbGlwc2UgPSBUUlVFLCBsYWJlbCA9IEZBTFNFLCBodWxsID0gRkFMU0UsIHNwaWRlcnMgPSBGQUxTRSwgcGxvdCA9IFRSVUUsIHB0LnNpemUgPSAxKQpUMl9kbW4kcGxvdCArIHRoZW1lX2NsYXNzaWMoKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9uX2Rtbl9UMi5wZGYiKQoKCiN0aGlzIHRpbWUgcG9pbnQgbmVlZHMgdG8gYmUgY2hlY2tlZCBvdXQuIFRoZSBvcmRpbmF0aW9uIGlzIG5vdCB3b3JraW5nIHByb3Blcmx5LiAKb3JkX3QzX2Rtbjwtb3JkaW5hdGUocGh5c2VxID0gc3Vic2V0X3NhbXBsZXMocHNfZG1uLCBUaW1lPT0iVDMiKSwgbWV0aG9kID0gIk5NRFMiLCBkaXN0YW5jZSA9ICJicmF5Iiwgaz0zLCB0cnltYXg9IDEwMCkKVDNfZG1uPC1nZ29yZGlwbG90czo6Z2dfb3JkaXBsb3Qob3JkID0gb3JkX3QzX2RtbiwgZ3JvdXBzID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19kbW4sIFRpbWUgPT0gIlQzIikpKSRIZXJiaWNpZGUsIGNob2ljZXMgPSBjKDEsIDIpLCBraW5kID0gYygic2UiKSwgY29uZiA9IDAuOTUsIHNob3cuZ3JvdXBzID0gImFsbCIsIGVsbGlwc2UgPSBUUlVFLCBsYWJlbCA9IEZBTFNFLCBodWxsID0gRkFMU0UsIHNwaWRlcnMgPSBGQUxTRSwgcGxvdCA9IFRSVUUsIHB0LnNpemUgPSAxKQpUM19kbW4kcGxvdCArIHRoZW1lX2NsYXNzaWMoKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9uX2Rtbl9UMy5wZGYiKQpgYGAKCk9yZGluYXRpb24gcGxvdHMgb24gcmFyZWZpZWQgZGF0YSBieSB0aW1lIHBvaW50LiAKYGBge3J9Cm9yZF90MV9yYXJlPC1vcmRpbmF0ZShwaHlzZXEgPSBzdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgVGltZT09IlQxIiksIG1ldGhvZCA9ICJOTURTIiwgZGlzdGFuY2UgPSAiYnJheSIsIGs9MywgdHJ5bWF4PSAxMDApClQxX3JhcmU8LWdnb3JkaXBsb3RzOjpnZ19vcmRpcGxvdChvcmQgPSBvcmRfdDFfcmFyZSwgZ3JvdXBzID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lID09ICJUMSIpKSkkSGVyYmljaWRlLCBjaG9pY2VzID0gYygxLCAyKSwga2luZCA9IGMoInNlIiksIGNvbmYgPSAwLjk1LCBzaG93Lmdyb3VwcyA9ICJhbGwiLCBlbGxpcHNlID0gVFJVRSwgbGFiZWwgPSBGQUxTRSwgaHVsbCA9IEZBTFNFLCBzcGlkZXJzID0gRkFMU0UsIHBsb3QgPSBUUlVFLCBwdC5zaXplID0gMSkKVDFfcmFyZSRwbG90ICsgdGhlbWVfY2xhc3NpYygpClQxX3JhcmU8LWdnb3JkaXBsb3RzOjpnZ19vcmRpcGxvdChvcmQgPSBvcmRfdDFfcmFyZSwgZ3JvdXBzID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lID09ICJUMSIpKSkkSGVyYmljaWRlLCBjaG9pY2VzID0gYygxLCAyKSwga2luZCA9IGMoInNlIiksIGNvbmYgPSAwLjk1LCBzaG93Lmdyb3VwcyA9ICJhbGwiLCBlbGxpcHNlID0gVFJVRSwgbGFiZWwgPSBGQUxTRSwgaHVsbCA9IEZBTFNFLCBzcGlkZXJzID0gRkFMU0UsIHBsb3QgPSBUUlVFLCBwdC5zaXplID0gMSkKVDFfcmFyZV9wbG90PC1UMV9yYXJlJHBsb3QgKyB0aGVtZV9jbGFzc2ljKCkgKyB4bGltKC0wLjUsIDAuNSkgKyB5bGltKC0wLjUsIDAuNSkgICsgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZCgiVHJlYXRtZW50IikpICsgeGxhYigiTk1EUyAxIikgKyB5bGFiKCJOTURTIDIiKQpUMV9yYXJlX3Bsb3QKbGlicmFyeShjb3dwbG90KQpteV9sZWdlbmQgPC0gZ2V0X2xlZ2VuZChUMV9yYXJlX3Bsb3QpCmxpYnJhcnkoZ2dwdWJyKQphc19nZ3Bsb3QobXlfbGVnZW5kKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9ubGVnZW5kLnBkZiIpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX29yZGluYXRpb25sZWdlbmQuZXBzIikKVDFfcmFyZV9wbG90PC1UMV9yYXJlX3Bsb3QgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpClQxX3JhcmVfcGxvdApnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9uX3JhcmVfVDEucGRmIikKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfb3JkaW5hdGlvbl9yYXJlX1QxLmVwcyIpCgpvcmRfdDJfcmFyZTwtb3JkaW5hdGUocGh5c2VxID0gc3Vic2V0X3NhbXBsZXMocHNfcmFyZV9zdWIsIFRpbWU9PSJUMiIpLCBtZXRob2QgPSAiTk1EUyIsIGRpc3RhbmNlID0gImJyYXkiLCBrPTMsIHRyeW1heD0gMTAwKQpUMl9yYXJlPC1nZ29yZGlwbG90czo6Z2dfb3JkaXBsb3Qob3JkID0gb3JkX3QyX3JhcmUsIGdyb3VwcyA9IGRhdGEuZnJhbWUoc2FtcGxlX2RhdGEoc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgVGltZSA9PSAiVDIiKSkpJEhlcmJpY2lkZSwgY2hvaWNlcyA9IGMoMSwgMiksIGtpbmQgPSBjKCJzZSIpLCBjb25mID0gMC45NSwgc2hvdy5ncm91cHMgPSAiYWxsIiwgZWxsaXBzZSA9IFRSVUUsIGxhYmVsID0gRkFMU0UsIGh1bGwgPSBGQUxTRSwgc3BpZGVycyA9IEZBTFNFLCBwbG90ID0gVFJVRSwgcHQuc2l6ZSA9IDEpClQyX3JhcmVfcGxvdDwtVDJfcmFyZSRwbG90ICsgdGhlbWVfY2xhc3NpYygpICsgeGxpbSgtMC41LCAwLjUpICsgeWxpbSgtMC41LCAwLjUpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAgKyB4bGFiKCJOTURTIDEiKSArIHlsYWIoIk5NRFMgMiIpClQyX3JhcmVfcGxvdApnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9uX3JhcmVfVDIucGRmIikKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfb3JkaW5hdGlvbl9yYXJlX1QyLmVwcyIpCgpvcmRfdDNfcmFyZTwtb3JkaW5hdGUocGh5c2VxID0gc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgVGltZT09IlQzIiksIG1ldGhvZCA9ICJOTURTIiwgZGlzdGFuY2UgPSAiYnJheSIsIGs9MywgdHJ5bWF4PSAxMDApClQzX3JhcmU8LWdnb3JkaXBsb3RzOjpnZ19vcmRpcGxvdChvcmQgPSBvcmRfdDNfcmFyZSwgZ3JvdXBzID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lID09ICJUMyIpKSkkSGVyYmljaWRlLCBjaG9pY2VzID0gYygxLCAyKSwga2luZCA9IGMoInNlIiksIGNvbmYgPSAwLjk1LCBzaG93Lmdyb3VwcyA9ICJhbGwiLCBlbGxpcHNlID0gVFJVRSwgbGFiZWwgPSBGQUxTRSwgaHVsbCA9IEZBTFNFLCBzcGlkZXJzID0gRkFMU0UsIHBsb3QgPSBUUlVFLCBwdC5zaXplID0gMSkKVDNfcmFyZV9wbG90PC1UM19yYXJlJHBsb3QgKyB0aGVtZV9jbGFzc2ljKCkgKyB4bGltKC0wLjUsIDAuNSkgKyB5bGltKC0wLjUsIDAuNSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICArIHhsYWIoIk5NRFMgMSIpICsgeWxhYigiTk1EUyAyIikKVDNfcmFyZV9wbG90CgpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9uX3JhcmVfVDMucGRmIikKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfb3JkaW5hdGlvbl9yYXJlX1QzLmVwcyIpCmxpYnJhcnkoZ2dwdWJyKQpnZ2FycmFuZ2UoVDFfcmFyZV9wbG90LCBUMl9yYXJlX3Bsb3QsIFQzX3JhcmVfcGxvdCwgbmNvbCA9IDEpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX2NvbWJpbmVkX29yZGluYXRpb24ucGRmIiwgd2lkdGggPSA1LCBoZWlnaHQgPSAxMCkKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfY29tYmluZWRfb3JkaW5hdGlvbi5lcHMiLCB3aWR0aCA9IDUsIGhlaWdodCA9IDEwKQpgYGAKCkNBUCBvcmRpbmF0aW9uIHBsb3RzIHJhcmVmaWVkCmBgYHsjcn0KdDFfZGlzdCA8LSBkaXN0YW5jZShzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lPT0iVDEiKSwgbWV0aG9kPSJicmF5IikgI2dldCB3VW5pZnJhYyBhbmQgc2F2ZQp0MV90YWJsZTwtYXMubWF0cml4KGRpc3QodDFfZGlzdCkpICN0cmFuc2Zvcm0gd1VuaWZyYWMgaW5kZXgKb3JkX3QxX3JhcmVfY2FwIDwtIGNhcHNjYWxlKHQxX3RhYmxlIH4gSGVyYmljaWRlLCBkYXRhLmZyYW1lKHNhbXBsZV9kYXRhKHN1YnNldF9zYW1wbGVzKHBzX3JhcmUsIFRpbWUgPT0gIlQxIikpKSkKVDFfcmFyZTwtZ2dvcmRpcGxvdHM6OmdnX29yZGlwbG90KG9yZCA9IG9yZF90MV9yYXJlX2NhcCwgZ3JvdXBzID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lID09ICJUMSIpKSkkSGVyYmljaWRlLCBjaG9pY2VzID0gYygxLCAyKSwga2luZCA9IGMoInNlIiksIGNvbmYgPSAwLjk1LCBzaG93Lmdyb3VwcyA9ICJhbGwiLCBlbGxpcHNlID0gVFJVRSwgbGFiZWwgPSBGQUxTRSwgaHVsbCA9IEZBTFNFLCBzcGlkZXJzID0gRkFMU0UsIHBsb3QgPSBUUlVFLCBwdC5zaXplID0gMSkKVDFfcmFyZSRwbG90ICsgdGhlbWVfY2xhc3NpYygpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX29yZGluYXRpb25fcmFyZV9UMV9jYXAucGRmIikKCgp0Ml9kaXN0IDwtIGRpc3RhbmNlKHN1YnNldF9zYW1wbGVzKHBzX3JhcmUsIFRpbWU9PSJUMiIpLCBtZXRob2Q9ImJyYXkiKSAjZ2V0IHdVbmlmcmFjIGFuZCBzYXZlCnQyX3RhYmxlPC1hcy5tYXRyaXgoZGlzdCh0Ml9kaXN0KSkgI3RyYW5zZm9ybSB3VW5pZnJhYyBpbmRleApvcmRfdDJfcmFyZV9jYXAgPC0gY2Fwc2NhbGUodDJfdGFibGUgfiBIZXJiaWNpZGUsIGRhdGEuZnJhbWUoc2FtcGxlX2RhdGEoc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgVGltZSA9PSAiVDIiKSkpKQpUMl9yYXJlPC1nZ29yZGlwbG90czo6Z2dfb3JkaXBsb3Qob3JkID0gb3JkX3QyX3JhcmVfY2FwLCBncm91cHMgPSBkYXRhLmZyYW1lKHNhbXBsZV9kYXRhKHN1YnNldF9zYW1wbGVzKHBzX3JhcmUsIFRpbWUgPT0gIlQyIikpKSRIZXJiaWNpZGUsIGNob2ljZXMgPSBjKDEsIDIpLCBraW5kID0gYygic2UiKSwgY29uZiA9IDAuOTUsIHNob3cuZ3JvdXBzID0gImFsbCIsIGVsbGlwc2UgPSBUUlVFLCBsYWJlbCA9IEZBTFNFLCBodWxsID0gRkFMU0UsIHNwaWRlcnMgPSBGQUxTRSwgcGxvdCA9IFRSVUUsIHB0LnNpemUgPSAxKQpUMl9yYXJlJHBsb3QgKyB0aGVtZV9jbGFzc2ljKCkKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfb3JkaW5hdGlvbl9yYXJlX1QyX2NhcC5wZGYiKQoKCiNHMTY2U0cgaWRlbnRpZmllZCBhcyBvdXRsaWVyIGJhc2VkIG9uIHBsb3RzIHdpdGggaXQgaW5jbHVkZWQuIFJlbW92ZWQgdG8gY3JlYXRlIHBsb3QuIApwc19yYXJlIDwtICBzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBzYW1wbGVfbmFtZXMocHNfcmFyZSkgIT0gIkcxNjZTRyIpCnQzX2Rpc3QgPC0gZGlzdGFuY2Uoc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgVGltZT09IlQzIiksIG1ldGhvZD0iYnJheSIpICNnZXQgd1VuaWZyYWMgYW5kIHNhdmUKdDNfdGFibGU8LWFzLm1hdHJpeChkaXN0KHQzX2Rpc3QpKSAjdHJhbnNmb3JtIHdVbmlmcmFjIGluZGV4Cm9yZF90M19yYXJlX2NhcCA8LSBjYXBzY2FsZSh0M190YWJsZSB+IEhlcmJpY2lkZSwgZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lID09ICJUMyIpKSkpClQzX3JhcmU8LWdnb3JkaXBsb3RzOjpnZ19vcmRpcGxvdChvcmQgPSBvcmRfdDNfcmFyZV9jYXAsIGdyb3VwcyA9IGRhdGEuZnJhbWUoc2FtcGxlX2RhdGEoc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgVGltZSA9PSAiVDMiKSkpJEhlcmJpY2lkZSwgY2hvaWNlcyA9IGMoMSwgMiksIGtpbmQgPSBjKCJzZSIpLCBjb25mID0gMC45NSwgc2hvdy5ncm91cHMgPSAiYWxsIiwgZWxsaXBzZSA9IFRSVUUsIGxhYmVsID0gRkFMU0UsIGh1bGwgPSBGQUxTRSwgc3BpZGVycyA9IEZBTFNFLCBwbG90ID0gVFJVRSwgcHQuc2l6ZSA9IDEpClQzX3JhcmUkcGxvdCArIHRoZW1lX2NsYXNzaWMoKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9uX3JhcmVfVDNfY2FwLnBkZiIpCgpgYGAKCgpQYWlyd2lzZSBhZG9uaXMgdGVzdGluZyBubyBuZWVkZWQgYmVjYXN1ZSBvZiBpbnNpZ25pZmljYW50IGdsb2FiYWwgdGVzdC4gCmBgYHsjcn0KcHNfcGFpcndpc2VhZG9uaXM8LWZ1bmN0aW9uKHBoeXNlcSl7CiAgb3R1X3RhYjwtZGF0YS5mcmFtZShwaHlsb3NlcTo6b3R1X3RhYmxlKHBoeXNlcSkpCiAgbWRfdGFiPC1kYXRhLmZyYW1lKHBoeWxvc2VxOjpzYW1wbGVfZGF0YShwaHlzZXEpKQogICAgaWYodGF4YV9hcmVfcm93cyhwaHlzZXEpPT0gVCl7CiAgICAgICBwaHlzZXFfZGlzdDwtcGFyYWxsZWxEaXN0OjpwYXJEaXN0KGFzLm1hdHJpeCh0KG90dV90YWIpKSwgbWV0aG9kID0gImJyYXkiKX0KICAgICAgICAgICAgZWxzZXtwaHlzZXFfZGlzdDwtcGFyYWxsZWxEaXN0OjpwYXJEaXN0KGFzLm1hdHJpeChvdHVfdGFiKSwgbWV0aG9kID0gImJyYXkiKX0KcGFpcndpc2VBZG9uaXM6OnBhaXJ3aXNlLmFkb25pcyh4ID0gcGh5c2VxX2Rpc3QsIGZhY3RvcnMgPSBtZF90YWIkSGVyYmljaWRlLCBwLmFkanVzdC5tID0gIm5vbmUiLCBwZXJtID0gMTAwMCkKfQoKcHNfdDE8LXN1YnNldF9zYW1wbGVzKHBzX3JhcmVfc3ViLCBUaW1lID09ICJUMSIpCnBzX3QxPC1wcnVuZV90YXhhKHRheGFfc3Vtcyhwc190MSkgPiAyLCBwc190MSkKCnBzX3QyPC1zdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgVGltZSA9PSAiVDIiKQpwc190MjwtcHJ1bmVfdGF4YSh0YXhhX3N1bXMocHNfdDIpID4gMiwgcHNfdDIpCgpwc190Mzwtc3Vic2V0X3NhbXBsZXMocHNfcmFyZV9zdWIsIFRpbWUgPT0gIlQzIikKcHNfdDM8LXBydW5lX3RheGEodGF4YV9zdW1zKHBzX3QzKSA+IDIsIHBzX3QzKQoKCnBzX3BhaXJ3aXNlYWRvbmlzKHBzX3QxKQpwc19wYWlyd2lzZWFkb25pcyhwc190MikKcHNfcGFpcndpc2VhZG9uaXMocHNfdDMpCmBgYAoKUGFpcndpc2UgYmV0YWRpc3ByIGJ5IHRyZWF0bWVudCwgdGltZSBhbmQgbW9kZQpgYGB7cn0KcHNfYmV0YWRpc3ByPC1mdW5jdGlvbihwaHlzZXEsIGdyb3VwaW5ndmFyID0gIkdyb3VwaW5ndmFyIil7CiAgb3R1X3RhYjwtZGF0YS5mcmFtZShwaHlsb3NlcTo6b3R1X3RhYmxlKHBoeXNlcSkpCiAgbWRfdGFiPC1kYXRhLmZyYW1lKHBoeWxvc2VxOjpzYW1wbGVfZGF0YShwaHlzZXEpKQogICAgaWYodGF4YV9hcmVfcm93cyhwaHlzZXEpPT0gVCl7CiAgICAgICBwaHlzZXFfZGlzdDwtcGFyYWxsZWxEaXN0OjpwYXJEaXN0KGFzLm1hdHJpeCh0KG90dV90YWIpKSwgbWV0aG9kID0gImJyYXkiKX0KICAgICAgICAgICAgZWxzZXtwaHlzZXFfZGlzdDwtcGFyYWxsZWxEaXN0OjpwYXJEaXN0KGFzLm1hdHJpeChvdHVfdGFiKSwgbWV0aG9kID0gImJyYXkiKX0KICAgICAgICAgICAgICAgIG1vZDwtdmVnYW46OmJldGFkaXNwZXIocGh5c2VxX2Rpc3QsIG1kX3RhYlssZ3JvdXBpbmd2YXJdKQogICAgICAgICMjIFBlcmZvcm0gdGVzdAogICAgICAgICAgICAgICAgcHJpbnQoYW5vdmEobW9kKSkKICAgICAgICAjIyBQZXJtdXRhdGlvbiB0ZXN0IGZvciBGCiAgICAgICAgICAgICAgICBwbW9kIDwtIHZlZ2FuOjpwZXJtdXRlc3QobW9kLCBwZXJtdXRhdGlvbnMgPSAxMDAwLCBwYWlyd2lzZSA9IFRSVUUpCiAgICAgICAgICAgICAgICBwcmludChwbW9kKQogICAgICAgICAgICAgICAgcHJpbnQoYm94cGxvdChtb2QpKQp9CmBgYAoKCnBlcm11dGUgdGVzdCBvZiBkaXNwZXJzaW9uIApgYGB7cn0KcHNfYmV0YWRpc3ByKHN1YnNldF9zYW1wbGVzKHBzX3JhcmVfc3ViLCBUaW1lID09ICJUMSIpLCBncm91cGluZ3ZhciA9ICJNb2RlIikKcHNfYmV0YWRpc3ByKHN1YnNldF9zYW1wbGVzKHBzX3JhcmVfc3ViLCBUaW1lID09ICJUMiIpLCBncm91cGluZ3ZhciA9ICJNb2RlIikKcHNfYmV0YWRpc3ByKHN1YnNldF9zYW1wbGVzKHBzX3JhcmVfc3ViLCBUaW1lID09ICJUMyIpLCBncm91cGluZ3ZhciA9ICJNb2RlIikKCnBzX2JldGFkaXNwcihzdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgTW9kZSA9PSAiQ2hlbWljYWwiKSwgZ3JvdXBpbmd2YXIgPSAiVGltZSIpCnBzX2JldGFkaXNwcihzdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgTW9kZSA9PSAiTm9uLVRyZWF0ZWQiKSwgZ3JvdXBpbmd2YXIgPSAiVGltZSIpCnBzX2JldGFkaXNwcihzdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgTW9kZSA9PSAiSGFuZCIpLCBncm91cGluZ3ZhciA9ICJUaW1lIikKCnBzX2JldGFkaXNwcihzdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgVGltZSA9PSAiVDEiKSwgZ3JvdXBpbmd2YXIgPSAiSGVyYmljaWRlIikKcHNfYmV0YWRpc3ByKHN1YnNldF9zYW1wbGVzKHBzX3JhcmVfc3ViLCBUaW1lID09ICJUMiIpLCBncm91cGluZ3ZhciA9ICJIZXJiaWNpZGUiKQpwc19iZXRhZGlzcHIoc3Vic2V0X3NhbXBsZXMocHNfcmFyZV9zdWIsIFRpbWUgPT0gIlQzIiksIGdyb3VwaW5ndmFyID0gIkhlcmJpY2lkZSIpCgpwc19iZXRhZGlzcHIoc3Vic2V0X3NhbXBsZXMocHNfcmFyZV9zdWIsIEhlcmJpY2lkZSA9PSAiR2x5cGhvc2F0ZSIpLCBncm91cGluZ3ZhciA9ICJUaW1lIikKcHNfYmV0YWRpc3ByKHN1YnNldF9zYW1wbGVzKHBzX3JhcmVfc3ViLCBIZXJiaWNpZGUgPT0gIkF0cmF6aW5lLU1lc290cmlvbmUiKSwgZ3JvdXBpbmd2YXIgPSAiVGltZSIpCnBzX2JldGFkaXNwcihzdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgSGVyYmljaWRlID09ICJEaWNhbWJhIiksIGdyb3VwaW5ndmFyID0gIlRpbWUiKQpwc19iZXRhZGlzcHIoc3Vic2V0X3NhbXBsZXMocHNfcmFyZV9zdWIsIEhlcmJpY2lkZSA9PSAiSGFuZHdlZWRlZCIpLCBncm91cGluZ3ZhciA9ICJUaW1lIikKcHNfYmV0YWRpc3ByKHN1YnNldF9zYW1wbGVzKHBzX3JhcmVfc3ViLCBIZXJiaWNpZGUgPT0gIk5vbi1UcmVhdGVkIiksIGdyb3VwaW5ndmFyID0gIlRpbWUiKQoKcHNfYmV0YWRpc3ByKHBzX3JhcmVfc3ViLCBncm91cGluZ3ZhciA9ICJUaW1lIikKYGBgCmBgYHtyfQpiZXRhX2JveHBsb3Q8LWZ1bmN0aW9uIChwaHlzZXEsIG1ldGhvZCA9ICJicmF5IiwgZ3JvdXApIAp7CiAgcmVxdWlyZSgicGh5bG9zZXEiKQogIHJlcXVpcmUoImdncGxvdDIiKQogIGdyb3VwMnNhbXAgPC0gbGlzdCgpCiAgZ3JvdXBfbGlzdCA8LSBnZXRfdmFyaWFibGUoc2FtcGxlX2RhdGEocGh5c2VxKSwgZ3JvdXApCiAgZm9yIChncm91cHMgaW4gbGV2ZWxzKGdyb3VwX2xpc3QpKSB7CiAgICB0YXJnZXRfZ3JvdXAgPC0gd2hpY2goZ3JvdXBfbGlzdCA9PSBncm91cHMpCiAgICBncm91cDJzYW1wW1tncm91cHNdXSA8LSBzYW1wbGVfbmFtZXMocGh5c2VxKVt0YXJnZXRfZ3JvdXBdCiAgfQogIGJldGFfZGl2X2Rpc3QgPC0gcGh5bG9zZXE6OmRpc3RhbmNlKHBoeXNlcSA9IHBoeXNlcSwgbWV0aG9kID0gbWV0aG9kKQogIGJldGFfZGl2X2Rpc3QgPC0gYXMoYmV0YV9kaXZfZGlzdCwgIm1hdHJpeCIpCiAgZGlzdF9kZiA8LSBkYXRhLmZyYW1lKCkKICBjb3VudGVyIDwtIDEKICBmb3IgKGdyb3VwcyBpbiBuYW1lcyhncm91cDJzYW1wKSkgewogICAgc3ViX2Rpc3QgPC0gYmV0YV9kaXZfZGlzdFtncm91cDJzYW1wW1tncm91cHNdXSwgZ3JvdXAyc2FtcFtbZ3JvdXBzXV1dCiAgICBub19zYW1wX2NvbCA8LSBuY29sKHN1Yl9kaXN0KQogICAgbm9fc2FtcF9yb3cgPC0gbnJvdyhzdWJfZGlzdCkKICAgIGZvciAoY29scyBpbiBzZXEobm9fc2FtcF9jb2wpKSB7CiAgICAgIGlmIChjb2xzID4gMSkgewogICAgICAgIGZvciAocm93cyBpbiBzZXEoKGNvbHMgLSAxKSkpIHsKICAgICAgICAgIGRpc3RfZGZbY291bnRlciwgInNhbXBsZV9wYWlyIl0gPC0gcGFzdGUwKGNvbG5hbWVzKHN1Yl9kaXN0KVtjb2xzXSwgCiAgICAgICAgICAgICItIiwgcm93bmFtZXMoc3ViX2Rpc3QpW3Jvd3NdKQogICAgICAgICAgZGlzdF9kZltjb3VudGVyLCAiZ3JvdXAiXSA8LSBncm91cHMKICAgICAgICAgIGRpc3RfZGZbY291bnRlciwgImJldGFfZGl2X21ldGhvZCJdIDwtIG1ldGhvZAogICAgICAgICAgZGlzdF9kZltjb3VudGVyLCAiYmV0YV9kaXZfdmFsdWUiXSA8LSBzdWJfZGlzdFtyb3dzLCAKICAgICAgICAgICAgY29sc10KICAgICAgICAgIGNvdW50ZXIgPSBjb3VudGVyICsgMQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBwbG90X2JveHBsb3QgPC0gZ2dwbG90KGRhdGEgPSBkaXN0X2RmLCBhZXMoeCA9IGdyb3VwLCB5ID0gYmV0YV9kaXZfdmFsdWUsIAogICAgY29sb3IgPSBncm91cCkpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyAKICAgIGdlb21faml0dGVyKCkgKyB0aGVtZV9idygpICsgeGxhYihncm91cCkgKyB5bGFiKG1ldGhvZCkgKyAKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSwgCiAgICAgIGhqdXN0ID0gMSkpCiAgbGlzdF9PdXQgPC0gbGlzdChkYXRhID0gZGlzdF9kZiwgcGxvdCA9IHBsb3RfYm94cGxvdCkKICByZXR1cm4obGlzdF9PdXQpCn0KCmBgYAoKQm94IGFuZCB3aGlza2VyIHBsb3RzIG9mIGRpc3RhbmNlIAp3aXRoaW4gZ3JvdXAgZGlzdGFuY2VzCmBgYHtyfQojcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoImFudG9uaW9nZ3NvdXNhL21pY3JVQklmdW5zIikKI2xpYnJhcnkobWljclVCSWZ1bnMpClQxX2JldGE8LWJldGFfYm94cGxvdChwaHlzZXEgPSBzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lPT0iVDEiKSwgbWV0aG9kID0gImJyYXkiLCBncm91cCA9ICJIZXJiaWNpZGUiKQpUMV9iZXRhX3Bsb3QgPC0gVDFfYmV0YSRwbG90ClQxX2JldGFfcGxvdCA8LSBUMV9iZXRhX3Bsb3QgKyB0aGVtZV9jbGFzc2ljKCkrIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQoIlRyZWF0bWVudCIpKSArIHlsYWIoIkJyYXktQ3VydGlzIERpc3NpbWlsYXJpdHkiKSArIHhsYWIoIiIpICsgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyB5bGltICgwLjMsIDAuNzUpClQxX2JldGFfcGxvdApteV9sZWdlbmQgPC0gZ2V0X2xlZ2VuZChUMV9iZXRhX3Bsb3QpCmFzX2dncGxvdChteV9sZWdlbmQpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX2JldGFfbGVnZW5kLnBkZiIpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX2JldGFfbGVnZW5kLmVwcyIpClQxX2JldGFfcGxvdDwtVDFfYmV0YV9wbG90KyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIApUMV9iZXRhX3Bsb3QKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfVDFfcmFyZV93aXRoaW5ncm91cF9iZXRhLnBkZiIpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX1QxX3JhcmVfd2l0aGluZ3JvdXBfYmV0YS5lcHMiKQpUMV9iZXRhX2RmPC0gVDFfYmV0YSRkYXRhClQxX2JldGFtb2Q8LWFvdihmb3JtdWxhID0gYmV0YV9kaXZfdmFsdWUgfiBncm91cCAsZGF0YSA9IFQxX2JldGFfZGYpCnN1bW1hcnkoVDFfYmV0YW1vZCkKVHVrZXlIU0QoeCA9IFQxX2JldGFtb2QsIHdoaWNoID0gImdyb3VwIikKClQyX2JldGE8LWJldGFfYm94cGxvdChwaHlzZXEgPSBzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lPT0iVDIiKSwgbWV0aG9kID0gImJyYXkiLCBncm91cCA9ICJIZXJiaWNpZGUiKQpUMl9iZXRhX3Bsb3QgPC0gVDJfYmV0YSRwbG90ClQyX2JldGFfcGxvdCA8LSBUMl9iZXRhX3Bsb3QrIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyB5bGFiKCJCcmF5LUN1cnRpcyBEaXNzaW1pbGFyaXR5IikgKyB4bGFiKCIiKSArIGdndGl0bGUoIiIpICsgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyB5bGltICgwLjMsIDAuNzUpClQyX2JldGFfcGxvdApnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19UMl9yYXJlX3dpdGhpbmdyb3VwX2JldGEucGRmIikKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfVDJfcmFyZV93aXRoaW5ncm91cF9iZXRhLmVwcyIpClQyX2JldGFfZGY8LSBUMl9iZXRhJGRhdGEKVDJfYmV0YW1vZDwtYW92KGZvcm11bGEgPSBiZXRhX2Rpdl92YWx1ZSB+IGdyb3VwICxkYXRhID0gVDJfYmV0YV9kZikKc3VtbWFyeShUMl9iZXRhbW9kKQpUdWtleUhTRCh4ID0gVDJfYmV0YW1vZCwgd2hpY2ggPSAiZ3JvdXAiKQoKVDNfYmV0YTwtYmV0YV9ib3hwbG90KHBoeXNlcSA9IHN1YnNldF9zYW1wbGVzKHBzX3JhcmUsIFRpbWU9PSJUMyIpLCBtZXRob2QgPSAiYnJheSIsIGdyb3VwID0gIkhlcmJpY2lkZSIpIApUM19iZXRhJHBsb3QgIysgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNGODc2NkQiLCAiI0EzQTUwMCIsICAiIzAwQkY3RCIsICIjMDBCMEY2IiwgIiNFNzZCRjMiKSkgKyAKVDNfYmV0YV9wbG90IDwtIFQzX2JldGEkcGxvdApUM19iZXRhX3Bsb3QgPC0gVDNfYmV0YV9wbG90ICsgdGhlbWVfY2xhc3NpYygpKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgeWxhYigiQnJheS1DdXJ0aXMgRGlzc2ltaWxhcml0eSIpICsgeGxhYigiIikgKyBnZ3RpdGxlKCIiKQpUM19iZXRhX3Bsb3QgPC1UM19iZXRhX3Bsb3QgKyB0aGVtZShheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArIHlsaW0gKDAuMywgMC43NSkKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfVDNfcmFyZV93aXRoaW5ncm91cF9iZXRhLnBkZiIpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX1QzX3JhcmVfd2l0aGluZ3JvdXBfYmV0YS5lcHMiKQoKVDNfYmV0YV9kZjwtIFQzX2JldGEkZGF0YQpUM19iZXRhbW9kPC1hb3YoZm9ybXVsYSA9IGJldGFfZGl2X3ZhbHVlIH4gZ3JvdXAgLGRhdGEgPSBUM19iZXRhX2RmKQpzdW1tYXJ5KFQzX2JldGFtb2QpClR1a2V5SFNEKHggPSBUM19iZXRhbW9kLCB3aGljaCA9ICJncm91cCIpCgpsaWJyYXJ5KGdncHVicikKZ2dhcnJhbmdlKFQxX2JldGFfcGxvdCwgVDJfYmV0YV9wbG90LCBUM19iZXRhX3Bsb3QsIG5jb2wgPSAxKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19jb21iaW5lZF9yYXJlX3dpdGhpbl9ncm91cF9iZXRhLnBkZiIsIHdpZHRoID0gNywgaGVpZ2h0ID0gMTApCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX2NvbWJpbmVkX3JhcmVfd2l0aGluX2dyb3VwX2JldGEuZXBzIiwgd2lkdGggPSA3LCBoZWlnaHQgPSAxMCkKYGBgCgpFeGFtaW5hdGlvbiBvZiBkaXNzaW1pbGFyaXR5IGFjcm9zcyB0aW1lIHBvaW50cyBieSB0cmVhdG1lbnQgYW5kIHRoZW4gYWdhaW4gYnkgYWxsIGNoZW1pY2FsIHRyZWF0bWVudHMgY29tYmluZWQuCmBgYHtyfQpUMV9iZXRhX2RmJFRpbWU8LSJUMSIKVDJfYmV0YV9kZiRUaW1lPC0iVDIiClQzX2JldGFfZGYkVGltZTwtIlQzIgoKCmJldGFfZGl2X1QxX1QyX1QzIDwtIHJiaW5kKFQxX2JldGFfZGYsIFQyX2JldGFfZGYsIFQzX2JldGFfZGYpCgpiZXRhX2Fub3ZhPC1mdW5jdGlvbihkYXRhLCBIZXJiaWNpZGUgPSAiSGVyYmljaWRlIil7CiAgZGZfc3ViPC0gZGF0YSAlPiUgZmlsdGVyKGdyb3VwID09IEhlcmJpY2lkZSkKICBtb2Q8LWFvdihiZXRhX2Rpdl92YWx1ZSB+IFRpbWUsIGRhdGEgPSBkZl9zdWIpCiAgcHJpbnQoc3VtbWFyeShtb2QpKQogIHByaW50KFR1a2V5SFNEKG1vZCwgIlRpbWUiKSkKICBib3hwbG90KGRmX3N1YiRiZXRhX2Rpdl92YWx1ZSB+IGRmX3N1YiRUaW1lKQp9CgojYmV0YV9hbm92YShiZXRhX2Rpdl9UMV9UMl9UMywgSGVyYmljaWRlID0gIk5vbi1UcmVhdGVkIikKI2JldGFfYW5vdmEoYmV0YV9kaXZfVDFfVDJfVDMsIEhlcmJpY2lkZSA9ICJIYW5kd2VlZGVkIikKI2JldGFfYW5vdmEoYmV0YV9kaXZfVDFfVDJfVDMsIEhlcmJpY2lkZSA9ICJEaWNhbWJhIikKI2JldGFfYW5vdmEoYmV0YV9kaXZfVDFfVDJfVDMsIEhlcmJpY2lkZSA9ICJBdHJhemluZS1NZXNvdHJpb25lIikKI2JldGFfYW5vdmEoYmV0YV9kaXZfVDFfVDJfVDMsIEhlcmJpY2lkZSA9ICJHbHlwaG9zYXRlIikKCiNyZWdyb3VwIGFsbCBjaGVtaWNhbCB0cmVhdG1lbnRzIHRvZ2V0aGVyIGFuZCByZXJ1biBiZXRhZGl2IGNhbGNzIHdpdGhpbiBncm91cC4gCnNhbXBsZV9kYXRhKHBzX3JhcmUpJE1vZGU8LXNhbXBsZV9kYXRhKHBzX3JhcmUpJEhlcmJpY2lkZQoKaW5kZXggPC0gYygiRGljYW1iYSIsICJHbHlwaG9zYXRlIiwgIkF0cmF6aW5lLU1lc290cmlvbmUiLCAiSGFuZHdlZWRlZCIsICJOb24tVHJlYXRlZCIpCnZhbHVlcyA8LSBjKCJDaGVtaWNhbCIsICJDaGVtaWNhbCIsICJDaGVtaWNhbCIsICJIYW5kd2VlZGVkIiwgIk5vbi1UcmVhdGVkIikKCnNhbXBsZV9kYXRhKHBzX3JhcmUpJE1vZGU8LSBhcy5mYWN0b3IodmFsdWVzW21hdGNoKHNhbXBsZV9kYXRhKHBzX3JhcmUpJE1vZGUsIGluZGV4KV0pCgojKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZGQTUwMCIsICIjMDBCMEY2IiwgIiNFNzZCRjMiKSkgCgoKVDFfYmV0YV9jaGVtaWNhbF9jb21iaW5lZDwtYmV0YV9ib3hwbG90KHBoeXNlcSA9IHN1YnNldF9zYW1wbGVzKHBzX3JhcmUsIFRpbWU9PSJUMSIpLCBtZXRob2QgPSAiYnJheSIsIGdyb3VwID0gIk1vZGUiKQpUMV9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3QgPC0gVDFfYmV0YV9jaGVtaWNhbF9jb21iaW5lZCRwbG90IApUMV9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3Q8LSBUMV9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3QgKyB0aGVtZV9jbGFzc2ljKCkgKyBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKCJUcmVhdG1lbnQiKSkgKyB5bGFiKCJCcmF5LUN1cnRpcyBEaXNzaW1pbGFyaXR5IikgKyB4bGFiKCIiKSArIHRoZW1lKGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgeWxpbSAoMC4zLCAwLjc1KSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkZBNTAwIiwgIiMwMEIwRjYiLCAiI0U3NkJGMyIpKSAKVDFfYmV0YV9jaGVtaWNhbF9jb21iaW5lZF9wbG90Cm15X2xlZ2VuZCA8LSBnZXRfbGVnZW5kKFQxX2JldGFfY2hlbWljYWxfY29tYmluZWRfcGxvdCkKYXNfZ2dwbG90KG15X2xlZ2VuZCkKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfYmV0YV9jb21iaW5lZF9sZWdlbmQucGRmIikKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfYmV0YV9jb21iaW5lZF9sZWdlbmQuZXBzIikKVDFfYmV0YV9jaGVtaWNhbF9jb21iaW5lZF9wbG90PC1UMV9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3QrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKVDFfYmV0YV9jaGVtaWNhbF9jb21iaW5lZF9wbG90CgoKVDJfYmV0YV9jaGVtaWNhbF9jb21iaW5lZDwtYmV0YV9ib3hwbG90KHBoeXNlcSA9IHN1YnNldF9zYW1wbGVzKHBzX3JhcmUsIFRpbWU9PSJUMiIpLCBtZXRob2QgPSAiYnJheSIsIGdyb3VwID0gIk1vZGUiKQpUMl9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3QgPC0gVDJfYmV0YV9jaGVtaWNhbF9jb21iaW5lZCRwbG90IApUMl9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3Q8LSBUMl9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3QgKyB0aGVtZV9jbGFzc2ljKCkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyB5bGFiKCJCcmF5LUN1cnRpcyBEaXNzaW1pbGFyaXR5IikgKyB4bGFiKCIiKSArIHRoZW1lKGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgeWxpbSAoMC4zLCAwLjc1KSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkZBNTAwIiwgIiMwMEIwRjYiLCAiI0U3NkJGMyIpKSAKVDJfYmV0YV9jaGVtaWNhbF9jb21iaW5lZF9wbG90CgoKClQzX2JldGFfY2hlbWljYWxfY29tYmluZWQ8LWJldGFfYm94cGxvdChwaHlzZXEgPSBzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lPT0iVDMiKSwgbWV0aG9kID0gImJyYXkiLCBncm91cCA9ICJNb2RlIikKVDNfYmV0YV9jaGVtaWNhbF9jb21iaW5lZF9wbG90IDwtIFQzX2JldGFfY2hlbWljYWxfY29tYmluZWQkcGxvdCAKVDNfYmV0YV9jaGVtaWNhbF9jb21iaW5lZF9wbG90PC0gVDNfYmV0YV9jaGVtaWNhbF9jb21iaW5lZF9wbG90ICsgdGhlbWVfY2xhc3NpYygpKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgeWxhYigiQnJheS1DdXJ0aXMgRGlzc2ltaWxhcml0eSIpICsgeGxhYigiIikgKyB0aGVtZShheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArIHlsaW0gKDAuMywgMC43NSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZGQTUwMCIsICIjMDBCMEY2IiwgIiNFNzZCRjMiKSkgClQzX2JldGFfY2hlbWljYWxfY29tYmluZWRfcGxvdAoKCmdnYXJyYW5nZShUMV9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3QsIFQyX2JldGFfY2hlbWljYWxfY29tYmluZWRfcGxvdCwgVDNfYmV0YV9jaGVtaWNhbF9jb21iaW5lZF9wbG90LCBuY29sID0gMSkKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfY29tYmluZWRfcmFyZV93aXRoaW5fZ3JvdXBfYmV0YV9jaGVtaWNhbF9jb21iaW5lZC5wZGYiLCB3aWR0aCA9IDUsIGhlaWdodCA9IDEwKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19jb21iaW5lZF9yYXJlX3dpdGhpbl9ncm91cF9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkLmVwcyIsIHdpZHRoID0gNSwgaGVpZ2h0ID0gMTApCmBgYAoKCmBgYHtyfQoKVDFfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCA8LSBUMV9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkJGRhdGEKVDJfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZDwtIFQyX2JldGFfY2hlbWljYWxfY29tYmluZWQkZGF0YQpUM19iZXRhX2RmX2NoZW1pY2FsX2NvbWJpbmVkPC0gVDNfYmV0YV9jaGVtaWNhbF9jb21iaW5lZCRkYXRhCgpUMV9iZXRhX2RmX2NoZW1pY2FsX2NvbWJpbmVkJFRpbWU8LSJUMSIKVDJfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCRUaW1lPC0iVDIiClQzX2JldGFfZGZfY2hlbWljYWxfY29tYmluZWQkVGltZTwtIlQzIgoKbTE8LWFvdihiZXRhX2Rpdl92YWx1ZSB+IGdyb3VwLCBkYXRhID0gVDFfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCkKc3VtbWFyeShtMSkKVHVrZXlIU0QobTEsICJncm91cCIpCmJveHBsb3QoYmV0YV9kaXZfdmFsdWUgfiBncm91cCwgZGF0YSA9IFQxX2JldGFfZGZfY2hlbWljYWxfY29tYmluZWQpCgoKbTI8LWFvdihiZXRhX2Rpdl92YWx1ZSB+IGdyb3VwLCBkYXRhID0gVDJfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCkKc3VtbWFyeShtMikKVHVrZXlIU0QobTIsICJncm91cCIpCmJveHBsb3QoYmV0YV9kaXZfdmFsdWUgfiBncm91cCwgZGF0YSA9IFQyX2JldGFfZGZfY2hlbWljYWxfY29tYmluZWQpCgptMzwtYW92KGJldGFfZGl2X3ZhbHVlIH4gZ3JvdXAsIGRhdGEgPSBUM19iZXRhX2RmX2NoZW1pY2FsX2NvbWJpbmVkKQpzdW1tYXJ5KG0zKQpUdWtleUhTRChtMywgImdyb3VwIikKYm94cGxvdChiZXRhX2Rpdl92YWx1ZSB+IGdyb3VwLCBkYXRhID0gVDNfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCkKCgpiZXRhX2Rpdl9fY2hlbWljYWxfY29tYmluZWRfVDFfVDJfVDMgPC0gcmJpbmQoVDFfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCwgVDJfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCwgVDNfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCkKCmJldGFfYW5vdmEoYmV0YV9kaXZfX2NoZW1pY2FsX2NvbWJpbmVkX1QxX1QyX1QzLCBIZXJiaWNpZGUgPSAiQ2hlbWljYWwiKQpiZXRhX2Fub3ZhKGJldGFfZGl2X19jaGVtaWNhbF9jb21iaW5lZF9UMV9UMl9UMywgSGVyYmljaWRlID0gIkhhbmQiKQpiZXRhX2Fub3ZhKGJldGFfZGl2X19jaGVtaWNhbF9jb21iaW5lZF9UMV9UMl9UMywgSGVyYmljaWRlID0gIk5vbi1UcmVhdGVkIikKYGBgCgp0cmVhdG1lbnQgdG8gY29udHJvbCAKYGBge3J9CgoKcGxvdERpc3RhbmNlcyA9IGZ1bmN0aW9uKHAsIG0sIHMsIGQpIHsKCiAgIyBjYWxjIGRpc3RhbmNlcwogIHd1ID0gcGh5bG9zZXE6OmRpc3RhbmNlKHAsIG0pCiAgd3UubSA9IG1lbHQoYXMubWF0cml4KHd1KSkKICAKICAjIHJlbW92ZSBzZWxmLWNvbXBhcmlzb25zCiAgd3UubSA9IHd1Lm0gJT4lCiAgICBmaWx0ZXIoYXMuY2hhcmFjdGVyKFZhcjEpICE9IGFzLmNoYXJhY3RlcihWYXIyKSkgJT4lCiAgICBtdXRhdGVfaWYoaXMuZmFjdG9yLGFzLmNoYXJhY3RlcikKICAKICAjIGdldCBzYW1wbGUgZGF0YSAoUzQgZXJyb3IgT0sgYW5kIGV4cGVjdGVkKQogIHNkID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShwKSkgJT4lCiAgICBzZWxlY3QocywgZCkgJT4lCiAgICBtdXRhdGVfaWYoaXMuZmFjdG9yLGFzLmNoYXJhY3RlcikKICBzZCRIZXJiaWNpZGUgPC0gZmFjdG9yKHNkJEhlcmJpY2lkZSwgbGV2ZWxzID0gYygiTm9uLVRyZWF0ZWQiLCAiSGFuZCIsICJBYXRyZXgiLCAiQ2xhcml0eSIsICJSb3VuZHVwIFBvd2VybWF4IikpCiAgCiAgIyBjb21iaW5lZCBkaXN0YW5jZXMgd2l0aCBzYW1wbGUgZGF0YQogIGNvbG5hbWVzKHNkKSA9IGMoIlZhcjEiLCAiVHlwZTEiKQogIHd1LnNkID0gbGVmdF9qb2luKHd1Lm0sIHNkLCBieSA9ICJWYXIxIikKICAKICBjb2xuYW1lcyhzZCkgPSBjKCJWYXIyIiwgIlR5cGUyIikKICB3dS5zZCA9IGxlZnRfam9pbih3dS5zZCwgc2QsIGJ5ID0gIlZhcjIiKQogIAogICNyZW1vdmUgdGhpcyBsaW5lIHRvIHBsb3QgYWxsIGNvbXBhcmlzb25zLiAKICB3dS5zZCA9IHd1LnNkICU+JSBmaWx0ZXIoVHlwZTEgPT0gIkhhbmQiIHwgVHlwZTEgPT0gIk5vbi1UcmVhdGVkIikKICAKICAjIHBsb3QKICBnZ3Bsb3Qod3Uuc2QsIGFlcyh4ID0gVHlwZTIsIHkgPSB2YWx1ZSkpICsKICAgIHRoZW1lX2J3KCkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGdlb21fYm94cGxvdChhZXMoY29sb3IgPSBpZmVsc2UoVHlwZTEgPT0gVHlwZTIsICJyZWQiLCAiYmxhY2siKSkpICsKICAgIHNjYWxlX2NvbG9yX2lkZW50aXR5KCkgKwogICAgZmFjZXRfd3JhcCh+IFR5cGUxLCBzY2FsZXMgPSAiZnJlZV94IikgKwogICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDUpKSArIAogICAgZ2d0aXRsZShwYXN0ZTAoIkRpc3RhbmNlIE1ldHJpYyA9ICIsIG0pKQogIAp9CmBgYAoKCmBgYHtyfQphPC1wbG90RGlzdGFuY2VzKHAgPSBzdWJzZXRfc2FtcGxlcyhwaHlzZXE9IHBzX3JhcmUsIFRpbWU9PSJUMSIpLCBtID0gImJyYXkiLCBzID0gIkJhcmNvZGVfSURfRyIsIGQgPSAiSGVyYmljaWRlIikKYSA8LSBhICsgZ2d0aXRsZSgiVGltZSAxIEJyYXktQ3VydGlzIERpc3NpbWxhcml0aWVzIikKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfVDFfcmFyZV9hbGxncm91cF9iZXRhLnBkZiIpCmI8LXBsb3REaXN0YW5jZXMocCA9IHN1YnNldF9zYW1wbGVzKHBoeXNlcT0gcHNfcmFyZSwgVGltZT09IlQyIiksIG0gPSAiYnJheSIsIHMgPSAiQmFyY29kZV9JRF9HIiwgZCA9ICJIZXJiaWNpZGUiKQpiIDwtYiArIGdndGl0bGUoIlRpbWUgMiBCcmF5LUN1cnRpcyBEaXNzaW1sYXJpdGllcyIpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX1QyX3JhcmVfYWxsZ3JvdXBfYmV0YS5wZGYiKQpjPC1wbG90RGlzdGFuY2VzKHAgPSBzdWJzZXRfc2FtcGxlcyhwaHlzZXE9IHBzX3JhcmUsIFRpbWU9PSJUMyIpLCBtID0gImJyYXkiLCBzID0gIkJhcmNvZGVfSURfRyIsIGQgPSAiSGVyYmljaWRlIikKYzwtIGMgKyBnZ3RpdGxlKCJUaW1lIDMgQnJheS1DdXJ0aXMgRGlzc2ltbGFyaXRpZXMiKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19UM19yYXJlX2FsbGdyb3VwX2JldGEucGRmIikKCmxpYnJhcnkoZ2dwdWJyKQpnZ2FycmFuZ2UoYSwgYiwgYywgbmNvbCA9IDEpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX2NvbWJpbmVkX3JhcmVfYWxsZ3JvdXBfYmV0YS5wZGYiLCB3aWR0aCA9IDcsIGhlaWdodCA9IDEyKQpgYGAKVGF4b24gYWJ1bmRhbmNlIGJhciBwbG90CgpgYGB7cn0KI2NyZWF0ZSBzdXBlciBsb25nIGNvbG9yIHZlY3Rvcgpjb2xfdmVjdG9yIDwtIGMoIiMwMDAwMDAiLCAiI0ZGRkYwMCIsICIjMUNFNkZGIiwgIiNGRjM0RkYiLCAiI0ZGNEE0NiIsICIjMDA4OTQxIiwgIiMwMDZGQTYiLCAiI0EzMDA1OSIsCiAgICAgICAgIiNGRkRCRTUiLCAiIzdBNDkwMCIsICIjMDAwMEE2IiwgIiM2M0ZGQUMiLCAiI0I3OTc2MiIsICIjMDA0RDQzIiwgIiM4RkIwRkYiLCAiIzk5N0Q4NyIsCiAgICAgICAgIiM1QTAwMDciLCAiIzgwOTY5MyIsICIjRkVGRkU2IiwgIiMxQjQ0MDAiLCAiIzRGQzYwMSIsICIjM0I1REZGIiwgIiM0QTNCNTMiLCAiI0ZGMkY4MCIsCiAgICAgICAgIiM2MTYxNUEiLCAiI0JBMDkwMCIsICIjNkI3OTAwIiwgIiMwMEMyQTAiLCAiI0ZGQUE5MiIsICIjRkY5MEM5IiwgIiNCOTAzQUEiLCAiI0QxNjEwMCIsCiAgICAgICAgIiNEREVGRkYiLCAiIzAwMDAzNSIsICIjN0I0RjRCIiwgIiNBMUMyOTkiLCAiIzMwMDAxOCIsICIjMEFBNkQ4IiwgIiMwMTMzNDkiLCAiIzAwODQ2RiIsCiAgICAgICAgIiMzNzIxMDEiLCAiI0ZGQjUwMCIsICIjQzJGRkVEIiwgIiNBMDc5QkYiLCAiI0NDMDc0NCIsICIjQzBCOUIyIiwgIiNDMkZGOTkiLCAiIzAwMUUwOSIsCiAgICAgICAgIiMwMDQ4OUMiLCAiIzZGMDA2MiIsICIjMENCRDY2IiwgIiNFRUMzRkYiLCAiIzQ1NkQ3NSIsICIjQjc3QjY4IiwgIiM3QTg3QTEiLCAiIzc4OEQ2NiIsCiAgICAgICAgIiM4ODU1NzgiLCAiI0ZBRDA5RiIsICIjRkY4QTlBIiwgIiNEMTU3QTAiLCAiI0JFQzQ1OSIsICIjNDU2NjQ4IiwgIiMwMDg2RUQiLCAiIzg4NkY0QyIsCiAgICAgICAgCiAgICAgICAgIiMzNDM2MkQiLCAiI0I0QThCRCIsICIjMDBBNkFBIiwgIiM0NTJDMkMiLCAiIzYzNjM3NSIsICIjQTNDOEM5IiwgIiNGRjkxM0YiLCAiIzkzOEE4MSIsCiAgICAgICAgIiM1NzUzMjkiLCAiIzAwRkVDRiIsICIjQjA1QjZGIiwgIiM4Q0QwRkYiLCAiIzNCOTcwMCIsICIjMDRGNzU3IiwgIiNDOEExQTEiLCAiIzFFNkUwMCIsCiAgICAgICAgIiM3OTAwRDciLCAiI0E3NzUwMCIsICIjNjM2N0E5IiwgIiNBMDU4MzciLCAiIzZCMDAyQyIsICIjNzcyNjAwIiwgIiNENzkwRkYiLCAiIzlCOTcwMCIsCiAgICAgICAgIiM1NDlFNzkiLCAiI0ZGRjY5RiIsICIjMjAxNjI1IiwgIiM3MjQxOEYiLCAiI0JDMjNGRiIsICIjOTlBREMwIiwgIiMzQTI0NjUiLCAiIzkyMjMyOSIsCiAgICAgICAgIiM1QjQ1MzQiLCAiI0ZERThEQyIsICIjNDA0RTU1IiwgIiMwMDg5QTMiLCAiI0NCN0U5OCIsICIjQTRFODA0IiwgIiMzMjRFNzIiLCAiIzZBM0E0QyIsCiAgICAgICAgIiM4M0FCNTgiLCAiIzAwMUMxRSIsICIjRDFGN0NFIiwgIiMwMDRCMjgiLCAiI0M4RDBGNiIsICIjQTNBNDg5IiwgIiM4MDZDNjYiLCAiIzIyMjgwMCIsCiAgICAgICAgIiNCRjU2NTAiLCAiI0U4MzAwMCIsICIjNjY3OTZEIiwgIiNEQTAwN0MiLCAiI0ZGMUE1OSIsICIjOEFEQkI0IiwgIiMxRTAyMDAiLCAiIzVCNEU1MSIsCiAgICAgICAgIiNDODk1QzUiLCAiIzMyMDAzMyIsICIjRkY2ODMyIiwgIiM2NkUxRDMiLCAiI0NGQ0RBQyIsICIjRDBBQzk0IiwgIiM3RUQzNzkiLCAiIzAxMkM1OCIsCiAgICAgICAgCiAgICAgICAgIiM3QTdCRkYiLCAiI0Q2OEUwMSIsICIjMzUzMzM5IiwgIiM3OEFGQTEiLCAiI0ZFQjJDNiIsICIjNzU3OTdDIiwgIiM4MzczOTMiLCAiIzk0M0E0RCIsCiAgICAgICAgIiNCNUY0RkYiLCAiI0QyRENENSIsICIjOTU1NkJEIiwgIiM2QTcxNEEiLCAiIzAwMTMyNSIsICIjMDI1MjVGIiwgIiMwQUEzRjciLCAiI0U5ODE3NiIsCiAgICAgICAgIiNEQkQ1REQiLCAiIzVFQkNEMSIsICIjM0Q0RjQ0IiwgIiM3RTY0MDUiLCAiIzAyNjg0RSIsICIjOTYyQjc1IiwgIiM4RDg1NDYiLCAiIzk2OTVDNSIsCiAgICAgICAgIiNFNzczQ0UiLCAiI0Q4NkE3OCIsICIjM0U4OUJFIiwgIiNDQTgzNEUiLCAiIzUxOEE4NyIsICIjNUIxMTNDIiwgIiM1NTgxM0IiLCAiI0U3MDRDNCIsCiAgICAgICAgIiMwMDAwNUYiLCAiI0E5NzM5OSIsICIjNEI4MTYwIiwgIiM1OTczOEEiLCAiI0ZGNURBNyIsICIjRjdDOUJGIiwgIiM2NDMxMjciLCAiIzUxM0EwMSIsCiAgICAgICAgIiM2Qjk0QUEiLCAiIzUxQTA1OCIsICIjQTQ1QjAyIiwgIiMxRDE3MDIiLCAiI0UyMDAyNyIsICIjRTdBQjYzIiwgIiM0QzYwMDEiLCAiIzlDNjk2NiIsCiAgICAgICAgIiM2NDU0N0IiLCAiIzk3OTc5RSIsICIjMDA2QTY2IiwgIiMzOTE0MDYiLCAiI0Y0RDc0OSIsICIjMDA0NUQyIiwgIiMwMDZDMzEiLCAiI0REQjZEMCIsCiAgICAgICAgIiM3QzY1NzEiLCAiIzlGQjJBNCIsICIjMDBEODkxIiwgIiMxNUEwOEEiLCAiI0JDNjVFOSIsICIjRkZGRkZFIiwgIiNDNkRDOTkiLCAiIzIwM0IzQyIsCgogICAgICAgICIjNjcxMTkwIiwgIiM2QjNBNjQiLCAiI0Y1RTFGRiIsICIjRkZBMEYyIiwgIiNDQ0FBMzUiLCAiIzM3NDUyNyIsICIjOEJCNDAwIiwgIiM3OTc4NjgiLAogICAgICAgICIjQzYwMDVBIiwgIiMzQjAwMEEiLCAiI0M4NjI0MCIsICIjMjk2MDdDIiwgIiM0MDIzMzQiLCAiIzdENUE0NCIsICIjQ0NCODdDIiwgIiNCODgxODMiLAogICAgICAgICIjQUE1MTk5IiwgIiNCNUQ2QzMiLCAiI0EzODQ2OSIsICIjOUY5NEYwIiwgIiNBNzQ1NzEiLCAiI0I4OTRBNiIsICIjNzFCQjhDIiwgIiMwMEI0MzMiLAogICAgICAgICIjNzg5RUM5IiwgIiM2RDgwQkEiLCAiIzk1M0YwMCIsICIjNUVGRjAzIiwgIiNFNEZGRkMiLCAiIzFCRTE3NyIsICIjQkNCMUU1IiwgIiM3NjkxMkYiLAogICAgICAgICIjMDAzMTA5IiwgIiMwMDYwQ0QiLCAiI0QyMDA5NiIsICIjODk1NTYzIiwgIiMyOTIwMUQiLCAiIzVCMzIxMyIsICIjQTc2RjQyIiwgIiM4OTQxMkUiLAogICAgICAgICIjMUEzQTJBIiwgIiM0OTRCNUEiLCAiI0E4OEM4NSIsICIjRjRBQkFBIiwgIiNBM0YzQUIiLCAiIzAwQzZDOCIsICIjRUE4QjY2IiwgIiM5NThBOUYiLAogICAgICAgICIjQkRDOUQyIiwgIiM5RkEwNjQiLCAiI0JFNDcwMCIsICIjNjU4MTg4IiwgIiM4M0E0ODUiLCAiIzQ1M0MyMyIsICIjNDc2NzVEIiwgIiMzQTNGMDAiLAogICAgICAgICIjMDYxMjAzIiwgIiNERkZCNzEiLCAiIzg2OEU3RSIsICIjOThEMDU4IiwgIiM2QzhGN0QiLCAiI0Q3QkZDMiIsICIjM0MzRTZFIiwgIiNEODNENjYiLAoKICAgICAgICAiIzJGNUQ5QiIsICIjNkM1RTQ2IiwgIiNEMjVCODgiLCAiIzVCNjU2QyIsICIjMDBCNTdGIiwgIiM1NDVDNDYiLCAiIzg2NjA5NyIsICIjMzY1RDI1IiwKICAgICAgICAiIzI1MkY5OSIsICIjMDBDQ0ZGIiwgIiM2NzRFNjAiLCAiI0ZDMDA5QyIsICIjOTI4OTZCIikKYGBgCgpgYGB7cn0KcGh5bHVtR2xvbW1lZCA8LSB0YXhfZ2xvbShwc19yYXJlLCAiUGh5bHVtIikKCiN0MQpwaHlsdW1HbG9tbWVkX2hlcmJfdDEgPC0gbWVyZ2Vfc2FtcGxlcyhzdWJzZXRfc2FtcGxlcyhwaHlzZXE9IHBoeWx1bUdsb21tZWQsIFRpbWU9PSJUMSIpLCBncm91cCA9ICJIZXJiaWNpZGUiKQpwaHlsdW1HbG9tbWVkX2hlcmJfdDEgPC0gdHJhbnNmb3JtX3NhbXBsZV9jb3VudHMocGh5bHVtR2xvbW1lZF9oZXJiX3QxLCBmdW5jdGlvbihPVFUpIE9UVS9zdW0oT1RVKSkKc2FtcGxlX2RhdGEocGh5bHVtR2xvbW1lZF9oZXJiX3QxKSRIZXJiaWNpZGUgPC0gZmFjdG9yKHNhbXBsZV9kYXRhKHBoeWx1bUdsb21tZWRfaGVyYl90MSkkSGVyYmljaWRlLCBsZXZlbHMgPSBjKDEsIDIsIDMsIDQsIDUpLCAKICAgICAgIGxhYmVscyA9IGMoIk5vbi1UcmVhdGVkIiwgIkhhbmQiLCAiQWF0cmV4IiwgIkNsYXJpdHkiLCAiUm91bmR1cCBQb3dlcm1heCIpKQoKcGxvdF9iYXIocGh5bHVtR2xvbW1lZF9oZXJiX3QxLCB4ID0gIkhlcmJpY2lkZSIsIGZpbGwgPSAiUGh5bHVtIikgICsgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZSgiUHJvcG9ydGlvbmFsIFRheG9uIEFidW5kYW5jZXMgVGltZSAxIikgKwp0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKG5yb3c9NikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSA1KSkgKyAKc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sX3ZlY3RvcikKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfVGF4b25fYmFycGxvdF90MS5wZGYiKQoKI3QyCnBoeWx1bUdsb21tZWRfaGVyYl90MiA8LSBtZXJnZV9zYW1wbGVzKHN1YnNldF9zYW1wbGVzKHBoeXNlcT0gcGh5bHVtR2xvbW1lZCwgVGltZT09IlQyIiksIGdyb3VwID0gIkhlcmJpY2lkZSIpCnBoeWx1bUdsb21tZWRfaGVyYl90MiA8LSB0cmFuc2Zvcm1fc2FtcGxlX2NvdW50cyhwaHlsdW1HbG9tbWVkX2hlcmJfdDIsIGZ1bmN0aW9uKE9UVSkgT1RVL3N1bShPVFUpKQpzYW1wbGVfZGF0YShwaHlsdW1HbG9tbWVkX2hlcmJfdDIpJEhlcmJpY2lkZSA8LSBmYWN0b3Ioc2FtcGxlX2RhdGEocGh5bHVtR2xvbW1lZF9oZXJiX3QyKSRIZXJiaWNpZGUsIGxldmVscyA9IGMoMSwgMiwgMywgNCwgNSksIAogICAgICAgbGFiZWxzID0gYygiTm9uLVRyZWF0ZWQiLCAiSGFuZCIsICJBYXRyZXgiLCAiQ2xhcml0eSIsICJSb3VuZHVwIFBvd2VybWF4IikpCgpwbG90X2JhcihwaHlsdW1HbG9tbWVkX2hlcmJfdDIsIHggPSAiSGVyYmljaWRlIiwgZmlsbCA9ICJQaHlsdW0iKSAgKyB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKCJQcm9wb3J0aW9uYWwgVGF4b24gQWJ1bmRhbmNlcyBUaW1lIDEiKSArCnRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKyBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQobnJvdz02KSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDUpKSArIApzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xfdmVjdG9yKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1B0MS9GaWd1cmVzL0lUU19UYXhvbl9iYXJwbG90X3QyLnBkZiIpCgojdDMKcGh5bHVtR2xvbW1lZF9oZXJiX3QzIDwtIG1lcmdlX3NhbXBsZXMoc3Vic2V0X3NhbXBsZXMocGh5c2VxPSBwaHlsdW1HbG9tbWVkLCBUaW1lPT0iVDMiKSwgZ3JvdXAgPSAiSGVyYmljaWRlIikKcGh5bHVtR2xvbW1lZF9oZXJiX3QzIDwtIHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKHBoeWx1bUdsb21tZWRfaGVyYl90MywgZnVuY3Rpb24oT1RVKSBPVFUvc3VtKE9UVSkpCnNhbXBsZV9kYXRhKHBoeWx1bUdsb21tZWRfaGVyYl90MykkSGVyYmljaWRlIDwtIGZhY3RvcihzYW1wbGVfZGF0YShwaHlsdW1HbG9tbWVkX2hlcmJfdDMpJEhlcmJpY2lkZSwgbGV2ZWxzID0gYygxLCAyLCAzLCA0LCA1KSwgCiAgICAgICBsYWJlbHMgPSBjKCJOb24tVHJlYXRlZCIsICJIYW5kIiwgIkFhdHJleCIsICJDbGFyaXR5IiwgIlJvdW5kdXAgUG93ZXJtYXgiKSkKCnBsb3RfYmFyKHBoeWx1bUdsb21tZWRfaGVyYl90MywgeCA9ICJIZXJiaWNpZGUiLCBmaWxsID0gIlBoeWx1bSIpICArIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUoIlByb3BvcnRpb25hbCBUYXhvbiBBYnVuZGFuY2VzIFRpbWUgMSIpICsKdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZChucm93PTYpKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKyB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gNSkpICsgCnNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbF92ZWN0b3IpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUHQxL0ZpZ3VyZXMvSVRTX1RheG9uX2JhcnBsb3RfdDMucGRmIikKYGBgCgpDb21iaW5lZCBoZXJiaWNpZGUgYW5kIHRpbWUgYmFyIHBsb3QKYGBge3J9CnNhbXBsZV9kYXRhKHBzX3JhcmVfc3ViKSRoZXJiX3RpbWU8LXBhc3RlKHNhbXBsZV9kYXRhKHBzX3JhcmVfc3ViKSRIZXJiaWNpZGUsIHNhbXBsZV9kYXRhKHBzX3JhcmVfc3ViKSRUaW1lLCBzZXAgPSAiXyIpCnBzX3JhcmVfZm9yX2JhcnBsb3QgPC0gcHJ1bmVfdGF4YSh0YXhhX3N1bXMocHNfcmFyZV9zdWIpID4gNTAsIHBzX3JhcmVfc3ViKQpwbG90X2Jhcihwc19yYXJlX2Zvcl9iYXJwbG90LCB4PSAiaGVyYl90aW1lIiwgZmlsbCA9ICJGYW1pbHkiKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbF92ZWN0b3IpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19CYXJQbG90X0hlcmJpY2lkZV9UaW1lLnBkZiIsIHdpZHRoID0gMjAsIGhlaWdodCA9IDExKQpgYGAKCkxpbmVhciBtb2RlbGluZyBvZiBhYnVuZGFudCB0YXhhCmBgYHtyfQoKVGF4X2dsb21fU3Vic2V0IDwtIGZ1bmN0aW9uIChwaHlzZXEsIHkgPSAidGF4TGV2ZWwiLCBucmV0dXJucyA9ICJOdW1iZXIgb2YgcmV0dXJucyIpewogICBwc18xPC0gdGF4X2dsb20ocHNfcmFyZV9zdWIsIHRheHJhbmsgPSB5ICkKICAgIG15VGF4YSA8LSBuYW1lcyhzb3J0KHRheGFfc3Vtcyhwc18xKSwgZGVjcmVhc2luZyA9IFRSVUUpWzE6bnJldHVybnNdKQogICAgICAgcHNfMV9zdWIgPC0gcHJ1bmVfdGF4YShteVRheGEsIHBzXzEpCiAgcmV0dXJuKHBzXzFfc3ViKQp9Cgpwc19yYXJlX2ZhbWlseV90b3AyNTwtVGF4X2dsb21fU3Vic2V0KHBoeXNlcSA9IHBzX3JhcmUsIG5yZXR1cm5zID0gMjUsIHkgPSAiRmFtaWx5IikKcHNfcmFyZV9vcmRlcl90b3AxMDwtVGF4X2dsb21fU3Vic2V0KHBoeXNlcSA9IHBzX3JhcmUsIG5yZXR1cm5zID0gMTAsIHkgPSAiT3JkZXIiKQoKI2V4cGxvcmUgdG9wIDI1IHRheGEgd2l0aCBwbG90IGJhcgpwbG90X2Jhcihwc19yYXJlX2ZhbWlseV90b3AyNSwgeD0gImhlcmJfdGltZSIsIGZpbGwgPSAiRmFtaWx5IikgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xfdmVjdG9yKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikKcGxvdF9iYXIocHNfcmFyZV9vcmRlcl90b3AxMCwgeD0gImhlcmJfdGltZSIsIGZpbGwgPSAiT3JkZXIiKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbF92ZWN0b3IpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKQoKCiN3cml0ZSBmdW5jdGlvbiB0byB3cmFuZ2xlIGRhdGEgcHJpb3IgdG8gYW5vdmEKCmFidW5kX2Fvdl93cmFuZ2xlIDwtIGZ1bmN0aW9uIChwaHlzZXEsIHkgPSAiVGF4X0xldmVsIil7CiAgdGF4PC10YXhfdGFibGUocGh5c2VxKVsseV0KICAgbWV0YTwtZGF0YS5mcmFtZShzYW1wbGVfZGF0YShwaHlzZXEpKQogIGNvdW50czwtZGF0YS5mcmFtZShvdHVfdGFibGUocGh5c2VxKSkKICByb3duYW1lcyhjb3VudHMpIDwtIHRheFssMV0KICBjb3VudHM8LWRhdGEuZnJhbWUodChjb3VudHMpKQogICBjb3VudHMkVGltZSA8LSBtZXRhJFRpbWUgCiAgIGNvdW50cyRIZXJiaWNpZGUgPC0gbWV0YSRIZXJiaWNpZGUgCiAgY291bnRzJEhlcmJfdGltZSA8LSBtZXRhJGhlcmJfdGltZSAKICByZXR1cm4oY291bnRzKQp9ICAgICAgICAgICAgCgp0ZXN0PC1hYnVuZF9hb3Zfd3JhbmdsZShwc19yYXJlX2ZhbWlseV90b3AyNSwgeSA9ICJGYW1pbHkiKQoKbW9kX2FidW5kPC1mdW5jdGlvbihjb3VudF90YWIsIElWID0gIkdyb3VwcyB0byBiZSB0ZXN0ZWQiKSB7CiAgIGZvcihqIGluIDE6bGVuZ3RoKHVuaXF1ZShjb3VudF90YWJbLCJIZXJiaWNpZGUiXSkpKXsKICAgICAgICAgZGF0YSA8LSBjb3VudF90YWIgJT4lIGZpbHRlcihIZXJiaWNpZGUgPT0gdW5pcXVlKGNvdW50X3RhYiRIZXJiaWNpZGUpW2pdKQogICAgICAgICAgICNjaGFuZ2UgdGhpcyB0byB0aGUgbnVtYmVyIG9mIHJldHVybnMgZnJvbSB0aGUgdGF4X2dsb21fc3Vic2V0IGZ1bmN0aW9uCiAgIGZvciAoaSBpbiAxOjI1KSB7IAogICAgICAgICAgICBtb2QgPC0gYW92KHVubGlzdChkYXRhW2ldKSB+IG1hdHJpeChkYXRhWyxJVl0pKSAKICAgICAgICAgICAgI3Nhbml0eSBjaGVjawogICAgICAgICAgICAjcHJpbnQoYyhqLCBpKSkKICAgaWYoc3VtbWFyeShtb2QpW1sxXV1bWyJQcig+RikiXV1bMV0gPD0gMC4wNSkgewogICAgcHJpbnQoc3VtbWFyeShtb2QpKQogICAgIHByaW50KGMoYXMuY2hhcmFjdGVyKHVuaXF1ZShjb3VudF90YWJbLCJIZXJiaWNpZGUiXSkpW2pdLCBuYW1lcyhkYXRhKVtpXSkpCiAgICAgICAgICAgICAgYm94cGxvdCh1bmxpc3QoZGF0YVtpXSkgfiB1bmxpc3QoZGF0YVtJVl0pLCBtYWluID1wYXN0ZShuYW1lcyhkYXRhW2ldKSwgYXMuY2hhcmFjdGVyKHVuaXF1ZShjb3VudF90YWJbLCJIZXJiaWNpZGUiXSkpW2pdKSwgeGxhYj0gIlRpbWUiLCB5bGFiPSJBYnVuZGFuY2UiKSAKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgfQoKCm1vZF9hYnVuZCh0ZXN0LCBJViA9ICJUaW1lIikKCgojZXhwbG9yZSAKcHNfcmFyZV9jZXJ0YWJvc2lkaWFjYWUgPC0gc3Vic2V0X3RheGEocHNfcmFyZSwgRmFtaWx5ID09ICJmOkNlcmF0b2Jhc2lkaWFjZWFlIikKcGxvdF9iYXIocHNfcmFyZV9jZXJ0YWJvc2lkaWFjYWUsIHg9ICJoZXJiX3RpbWUiKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbF92ZWN0b3IpCmBgYAo=